Persist data

3 snippets in Docker

DKDocker

Volume Mounts (-v)

DK · Run Options
syntax
docker run -v <host_path>:<container_path>[:<options>] <image>
docker run -v <volume_name>:<container_path> <image>
example
docker run -v ./src:/app/src myapp:1.0
docker run -v pgdata:/var/lib/postgresql/data postgres:16
docker run -v ./config.json:/app/config.json:ro myapp:1.0

Note Host paths starting with ./ or / create bind mounts. A plain name like pgdata creates or reuses a named volume. Append :ro for read-only. If the host path does not exist, Docker creates it as a directory (not a file), which often causes surprises.

Volumes in Compose

DK · Docker Compose
syntax
services:
  db:
    volumes:
      - <name>:<container_path>
volumes:
  <name>:
example
services:
  db:
    image: postgres:16
    volumes:
      - pgdata:/var/lib/postgresql/data
      - ./init.sql:/docker-entrypoint-initdb.d/init.sql:ro
volumes:
  pgdata:

Note Named volumes declared in the top-level volumes: key persist across restarts and compose down. Bind mounts (host paths) are useful for development but should not be used for database storage in production.

Named Volumes

DK · Volumes & Storage
syntax
docker volume create <name>
docker run -v <name>:<container_path> <image>
example
docker volume create pgdata
docker run -d -v pgdata:/var/lib/postgresql/data postgres:16
output
pgdata

Note Named volumes are managed by Docker and stored under /var/lib/docker/volumes/ on Linux. They persist independently of containers and survive docker rm. This is the recommended way to persist database data.