无法使用 docker-compose 中的命名卷保存 postgresql 数据

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

我正在使用 docker-compose 启动 spring api 和 postgres 数据库。我是 docker 的新手,我正在尝试使用我用

创建的命名卷来保存我的数据库
docker volume create employeedata 

我在我的 docker-compose.yml 中添加了这个卷,但是如果我停止或删除我的容器,数据库不会持续存在。

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:
   

我试过 docker inspect employeedata 并得到以下结果

我觉得 docker-compose 版本是 2 而不是 3,而且我不明白挂载点与我在上面的 docker-compose.yml 中指定的卷路径有何关系

非常感谢你的帮助

docker compose 在项目命名空间中创建了所有对象。此命名空间通常是 docker-compose.yml 文件的文件夹名称,但您可以通过将 --project-name 传递给(所有)对 docker compose 的调用来设置它。

由于 docker 没有第一个 class 命名空间,项目名称只是用作组合文件中定义的所有对象的前缀,所以在这种情况下,假设您的项目位于一个名为“project”的文件夹,然后 compose 将创建 project_app 作为容器,并创建 project_employeedata 作为卷。

要覆盖它,您可以指定一个明确的 container-name,就像您所做的那样。但是您真的不应该这样做,因为这意味着任何两个具有此名称的撰写文件的部署现在都会发生冲突。

并为卷覆盖它 - 告诉 docker compose 该卷是外部创建的并提供外部名称。否则 compose 将尝试使用命名空间名称。

volumes:
  employeedata:
    external: true
    name: employeedata

同样,让 compose 管理卷名可能是更好的选择。只需确保托管撰写文件的目录具有合适的唯一名称 - 或者确保通过 --project-name 传递合适的唯一名称,然后使用 whatever_employeedata.

管理卷

注意。 Docker 除非将 -v / --volumes 传递给 docker compose down,否则 compose 不会删除 compose 托管卷,因此您的数据将保留在这里。

/var/lib/docker/volumes 只是 docker 管理卷的(默认)位置。

2.0 指的是 compose 的版本,不是你 compose.yml 文件中的版本。