Volume
The Volume resource allows you to create and manage persistent Docker volumes using Alchemy.
import * as docker from "alchemy/docker";
const myVolume = await docker.Volume("data-volume", {  name: "app-data",  driver: "local"});Properties
Section titled “Properties”| Name | Type | Required | Description | 
|---|---|---|---|
| name | string | Yes | Docker volume name | 
| driver | string | No | Volume driver to use (defaults to “local”) | 
| driverOpts | Record<string, string> | No | Driver-specific options | 
| labels | VolumeLabel[] | Record<string, string> | No | Custom metadata labels for the volume | 
The VolumeLabel interface has the following structure:
interface VolumeLabel {  name: string;   // Label name  value: string;  // Label value}Outputs
Section titled “Outputs”| Name | Type | Description | 
|---|---|---|
| id | string | Volume ID (same as name for Docker volumes) | 
| mountpoint | string | Volume mountpoint path on the host | 
| createdAt | number | Time when the volume was created | 
Example
Section titled “Example”import * as docker from "alchemy/docker";
// Create a simple Docker volume for persistent dataconst dataVolume = await docker.Volume("data-volume", {  name: "postgres-data"});
// Create a Docker volume with custom driver optionsconst dbVolume = await docker.Volume("db-data", {  name: "mysql-data",  driver: "local",  driverOpts: {    "type": "nfs",    "o": "addr=10.0.0.1,rw",    "device": ":/path/to/dir"  }});
// Create a volume with labels (array format)const logsVolume = await docker.Volume("logs-volume", {  name: "app-logs",  labels: [    { name: "com.example.environment", value: "production" },    { name: "com.example.created-by", value: "alchemy" }  ]});
// Create a volume with labels (record format)const configVolume = await docker.Volume("config-volume", {  name: "app-config",  labels: {    "com.example.environment": "staging",    "com.example.created-by": "alchemy"  }});
// Use volumes with a containerconst dbContainer = await docker.Container("database", {  image: "postgres:14",  name: "postgres",  volumes: [    {      hostPath: dataVolume.name,    // Reference the volume by name      containerPath: "/var/lib/postgresql/data"    },    {      hostPath: logsVolume.name,      containerPath: "/var/log/postgresql",      readOnly: false    }  ],  environment: {    POSTGRES_PASSWORD: "secret"  },  restart: "always",  start: true});Using Docker Volumes for Persistence
Section titled “Using Docker Volumes for Persistence”Docker volumes are the preferred mechanism for persisting data generated by and used by Docker containers. Their benefits include:
- Data Persistence: Data stored in volumes persists even when containers are stopped or removed
- Performance: Better performance than bind mounts, especially on Windows and macOS
- Portability: Volumes can be easily backed up, restored, and migrated
- Driver Support: Support for various storage backends through volume drivers
When using Docker volumes with Alchemy, it’s a common pattern to:
- Create volumes with meaningful names
- Assign metadata using labels
- Reference volumes in containers by name
- Configure volume permissions with the readOnlyflag when mounting