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?
According to the Dockment of Docker Compose, when you write something like:
It creates a new docker volume and map it to
/var/lib/postgresql/data
inside the container. Therefore, each time you rundocker-compose up
anddocker-compose down
, it creates new volume. You can confirm the behavior withdocker 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>
.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.
With
external: true
, docker-compose won't create themypostgredb
volume, so you have to create it by your own using following command:The data of postgresql will be saved into docker volume named
mypostgredb
. Read reference for more detail.