我一直在尝试使用 docker-compose 来启动 postgres container容器,具有单个持久命名卷。
目标是让不同的 postgres 容器共享相同的持久数据(不是同时!) - 一个容器死亡或被杀死,另一个容器取代它,而不会丢失以前的持久数据。
据我了解,“命名卷”应该取代“数据卷容器”。 但是,到目前为止,发生了以下两种情况之一:
- postgres 容器启动失败,并显示错误消息“错误:容器命令未找到或不存在。”
- 我仅实现了该特定容器的持久性。如果它被停止并删除并且另一个容器启动,我们将从一张白纸开始。
据我了解,postgres 镜像确实创建了自己的卷,它当然绑定(bind)到该特定容器。如果我可以为该卷添加别名或链接或具有指定卷的内容,那就太好了。
docker-compose.yml 的当前版本:
version: '2'
services:
db:
image: postgres
restart: allways
volumes:
- myappdb:/var/lib/postgresql/data/
environment:
- POSTGRES_PASSWORD=mysecretpasswordPleaseChangeME
volumes:
myappdb:
driver: local
我是否做了一些愚蠢的错误,或者尝试了一些根本不支持的事情?
- Docker 版本 1.10.3,内部版本 20f81dd
- docker-compose 版本 1.6.0, 构建d99cad6
最佳答案
好的,经过大量的试验和错误,现在一切正常(这意味着我可以运行 docker-compose down ,然后运行 docker-compose up ) > 并且我的数据处于使用 down
命令留下的状态。
总的来说,有以下几点:
- 请勿将 PGDATA 环境选项与官方 postgres image 一起使用
- 如果使用 spring boot(就像我一样)和 docker compose(就像我一样)并将
environment
选项传递给链接到数据库容器的服务,请勿将配置文件名称用双引号引起来。它按原样传递给 Spring,从而导致将不存在的配置文件用作事件配置文件。
我最初配置了一些微妙而奇怪的事情,但我怀疑 killer 是上面的第 2 点 - 它导致我的应用程序在容器中运行时使用内存中的 H2 数据库而不是链接的容器数据库。所以一切都(几乎)完美地运行 - 直到容器关闭。而且,当从 IDE 运行时,针对容器数据库(端口暴露给主机),所有操作都完美运行(包括持久性),因为事件配置文件参数已在 IDE 启动器中正确设置(无引号!)。
生活和学习我猜(但我确实感觉脸上有很多鸡蛋)。
关于docker - 如何将镜像创建的卷与 docker-compose 指定的命名卷链接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36245276/