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
readOnly
flag when mounting