无法使用 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 文件中的版本。
我正在使用 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 文件中的版本。