Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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:

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?

like image 761
sixtimes Avatar asked Jan 05 '23 18:01

sixtimes


1 Answers

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.

like image 84
ymonad Avatar answered Jan 12 '23 04:01

ymonad