Search code examples
postgresqldockerdocker-composedocker-volume

unable to persist postgresql data using named volume in docker-compose


I am using docker-compose to spin up a spring api with a postgres database . I am new to docker and I am trying to persist my database using a named volume I created with

docker volume create employeedata 

I add this volume inside my docker-compose.yml but the db does not persist if I stop or remove my containers .

version: '3.8'
services:
  app:
    container_name: springboot-postgresql
    image: springboot-postgresql
    build: ./
    ports:
      - "8080:8080"
    depends_on:
      - postgresqldb
  postgresqldb:
    image: postgres
    ports:
      - "5432:5432"
    volumes:
      - employeedata:/var/lib/postgresql/data
    environment:
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_USER=postgres
      - POSTGRES_DB=employeedb
volumes:
  employeedata:
   

I tried doing docker inspect employeedata and got the result below

enter image description here

It seems fishy to me that the docker-compose version is 2 and not 3 plus I don't understand how the mountpoint is related to the volume path I specify in my docker-compose.yml above

I would appreciate your help


Solution

  • docker compose created all objects in a project namespace. This namespace is usually the folder name of the docker-compose.yml file but you can set it by passing --project-name to (all) your calls to docker compose.

    As docker does not have first class namespaces, the project name is simply used as a prefix for all objects defined in the compose file, so in this case, assuming your project was in a folder called "project" then compose would have created project_app as the container and project_employeedata as the volume.

    To override this, you specify an explict container-name as you have done. But you really shouldn't as it means that any two deployments of compose files with this name will now conflict.

    And to override it for volumes - tell docker compose that the volume is externally created and provide the external name. Otherwise compose will try to use the namespaced name.

    volumes:
      employeedata:
        external: true
        name: employeedata
    

    Again, letting compose manage the volume name is probably the better option. Simply ensure the directory hosting the compose file has a unique name that is suitable - or ensure a suitable unique name is passed via --project-name, and then manage the volume using whatever_employeedata.

    nb. Docker compose does not remove compose managed volumes unless -v / --volumes is passed to docker compose down so your data will persist here.

    /var/lib/docker/volumes is simply the (default) location that docker will manage volumes.

    The 2.0 refers to the version of compose, not the version in your compose.yml file.