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:

  • docker-machine fails to start host
  • Docker in a Parallels' Virtual Windows 10 Pro Machine
  • debconf warnings despite DEBIAN_FRONTEND inside Docker image
  • Is it safe to export tarball of running docker container?
  • How to access JIRA Software files in a docker image?
  • docker-compose not showing any changes to code
  • version: '2'
    services:
      api:
        build: .
        ports:
          - '8245:8245'
        volumes:
          - .:/home/app/api
          - /home/app/api/node_modules
          - /home/app/api/public/src/bower_components
        links:
          - db
      db:
        build: ./database
        env_file: .env
        ports:
          - '8246:5432'
        volumes_from:
          - dbdata
    
      dbdata:
        image: "postgres:9.5.2"
        volumes:
          - /var/lib/postgresql/data
    

    Help?

  • Why the “See It Work” section of the Docker https-portal gives me a “port 443: Connection refused” error?
  • Docker - check private registry image version
  • What's inside a Docker image/container?
  • Docker fails at first run after install. Error Post http://… permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
  • Docker Container starting with mongo server
  • Regarding not getting GNU awk version after creating a docker basic container
  • One Solution collect form web for “Persisting database using docker volumes”

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

    volumes:
      - /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>.

    volumes:
      - /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'
    services:
      dbdata:
        image: postgres:9.5.2
        volumes:
          - mypostgresdb:/var/lib/postgresql/data
    volumes:
      mypostgresdb:
        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.