如何将映像创建的卷与 docker-compose 指定的命名卷链接?
Posted
技术标签:
【中文标题】如何将映像创建的卷与 docker-compose 指定的命名卷链接?【英文标题】:How can I link an image created volume with a docker-compose specified named volume? 【发布时间】:2016-07-14 16:55:15 【问题描述】:我一直在尝试使用 docker-compose 来启动一个 postgres container 容器,其中包含一个持久的命名卷。
目标是让不同的 postgres 容器共享相同的持久数据(不是同时!) - 一个容器死亡或被杀死,另一个容器在不丢失以前持久数据的情况下发生。
据我了解,“命名卷”应该替换“数据卷容器”。 但是,到目前为止,发生了以下两种情况之一:
-
postgres 容器无法启动,并显示错误消息“错误:找不到容器命令或不存在。”
我只为那个特定的容器实现了持久性。如果它被停止并移除并启动另一个容器,我们将从空白开始。
所以,据我了解,postgres 映像确实创建了它自己的卷,它当然绑定到该特定容器。这很好,如果我可以得到那个卷的别名或链接或命名卷的东西。
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【问题讨论】:
【参考方案1】:好的,经过大量试验和错误,现在一切正常(这意味着我可以运行docker-compose down
,然后运行docker-compose up
,并且我的数据处于@987654324 留下的状态@ 命令)。
总的来说,有几件事:
-
官方postgres image不要使用PGDATA环境选项
如果使用 spring boot(像我一样)和 docker compose(像我一样)并将
environment
选项传递给链接到您的数据库容器的服务,请不要将配置文件名称用双引号括起来。它按原样传递给 Spring,导致将不存在的配置文件用作活动配置文件。
我最初配置了一些微妙而奇怪的东西,但我怀疑杀手是上面的第 2 点 - 它导致我的应用程序在容器中运行时使用 in-mem H2 数据库而不是链接的容器数据库。所以一切都(几乎)完美地运行——直到容器关闭。而且,当从 IDE 运行时,针对容器 DB(端口暴露给主机),一切都运行良好(包括持久性),因为在 IDE 启动器中正确设置了活动配置文件参数(没有引号!)。
我猜是生活和学习(但我确实觉得脸上有很多鸡蛋)。
【讨论】:
【参考方案2】:您需要告诉 Compose 它应该管理 Volume 的创建,否则它假定它应该已经存在于主机上。
volumes:
myappdb:
external: false
文档:https://docs.docker.com/compose/compose-file/#external
【讨论】:
我明白你的建议,但不幸的是,这不起作用。我还必须承认,示例 docker-compose.yml 文件是一个较大文件的摘录。看起来这实际上按预期工作(我可以停止和删除数据库容器,创建并启动一个新容器,我的数据很好)。我会小心地将这个工作定义放到更大的文件中,看看那里会发生什么。感谢您的尝试! 我注意到另一件奇怪的事情 - 在对损坏的配置执行docker-compose up
时,在 db 容器失败后,docker volume ls
将显示卷名。但该文件夹实际上并不存在于主机/var/lib/docker/volumes
以上是关于如何将映像创建的卷与 docker-compose 指定的命名卷链接?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 docker 中的卷同步 node.js 工作区更改
在构建时使用 docker-compose 将环境变量传递给 docker 映像
使用 docker-compose 的 Elastic Beanstalk Docker 私有注册表
使用 docker-compose 将 Docker 映像部署到谷歌云运行
尝试通过 docker-compose 将 NodeJS 应用程序连接到 MySQL 映像时出现 ECONNREFUSED