- When a docker container is deleted, relaunching it from the image will start a fresh new container without any of the changes made in the previously running container
- This happens because when we create a new container from an image, we add a new writable layer on top of the underlying stack of layers present in the base docker image.
- All changes made to the running container, such as creating new tables, inserting data etc are written to the writable container layer
- This writable layer does not persist after the container is deleted, therefore if you launch a postgreSQL container and create database and delete the container all the data will also get lost.
- In order to save or persist the data even after a container is deleted , you should use volumes.
- volumes are directories (or files) that are outside of the container and exist as normal directories and files on the host filesystem
- Idea is to launch the container but mount the volume on host file system so that even if the container is deleted , data can continue to persist in the host file system.
- I will explain it by mounting volume to a postgreSQL container and also initializing the database with some initialization scripts to create table and load data
- create a docker-compose.yml file
services: db: container_name: docker_pg environment: POSTGRES_DB: northwind POSTGRES_PASSWORD: changeme image: "postgres:12" ports: - "5432:5432" volumes: - /Users/nola/docker/postgres/docker-pg-vol/data:/var/lib/postgresql/data - /Users/nola/docker/postgres/init/initData.sql:/docker-entrypoint-initdb.d/ version: "3" volumes: pg-data: driver: local
- volumes: Users/nola/docker/postgres/docker-pg-vol/data:/var/lib/postgresql/data means mount the localhost data directory Users/nola/docker/postgres/docker-pg-vol/data to containers data directory /var/lib/postgresql/data. Write to data will happen now in this host location
- Initialize database: To initialize database i have created the initial scripts in my local at /Users/nola/docker/postgres/init/initData.sql and mounted that to /docker-entrypoint-initdb.d/ location of the container
- Rest of the entries in docker compose files are straight forward it has container name, database name, password, ports of container mapped to local host port and image name
- With this when you execute
docker compose up
- This will bring the new container up with data file mounted to host computer and initialization scripts
- docker compose file and data initialization is located at
Thank you !