Persisting database using docker volumes

I’m trying to persist postgres data in a docker container so that as soon as you docker-compose down and docker-compose up -d you don’t lose data from your previous session. I haven’t been able to make it do much of anything – pulling the container down and back up again routinely deletes the data.

Here’s my current docker-compose.yml:

  • How to start docker container after succesfull wait-for-it script
  • Docker env variables not set while log via shell
  • Docker Not Linking Containers
  • How can I make all my docker containers use my proxy?
  • Why can't I `docker exec` after installing the official Django docker image?
  • OS X Docker does not set repo name nor tag after build
  • version: '2'
        build: .
          - '8245:8245'
          - .:/home/app/api
          - /home/app/api/node_modules
          - /home/app/api/public/src/bower_components
          - db
        build: ./database
        env_file: .env
          - '8246:5432'
          - dbdata
        image: "postgres:9.5.2"
          - /var/lib/postgresql/data


  • How to automatically start a service when running a docker container?
  • “docker run hello-world” through a proxy tunnel
  • How to import .bacpac into docker Sqlserver?
  • Moved Temporarily (predicitonio) quick start app
  • Docker swarm cluster and elasticsearch, using constraints to bind a service to a specific node
  • Ember and Sails Deployment
  • One Solution collect form web for “Persisting database using docker volumes”

    According to the Dockment of Docker Compose, when you write something like:

      - /var/lib/postgresql/data

    It creates a new docker volume and map it to /var/lib/postgresql/data inside the container.
    Therefore, each time you run docker-compose up and docker-compose down, it creates new volume. You can confirm the behavior with docker volume ls.

    To avoid it, you have two options:

    (A) Map host directory into container

    You can map directory of host into container using <HOST_PATH>:<CONTAINER_PATH>.

      - /path/to/your/host/directory:/var/lib/postgresql/data

    The data of postgresql will be saved into /path/to/your/host/directory of the container host.

    (B) Use external container

    docker-compose has an option of external container.
    When it is set to true, it won’t always create volume.
    Here’s an example.

    version: '2'
        image: postgres:9.5.2
          - mypostgresdb:/var/lib/postgresql/data
        external: true

    With external: true, docker-compose won’t create the mypostgredb volume, so you have to create it by your own using following command:

    docker volume create --name=mypostgredb

    The data of postgresql will be saved into docker volume named mypostgredb. Read reference for more detail.

    Docker will be the best open platform for developers and sysadmins to build, ship, and run distributed applications.