如何将映像创建的卷与 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 工作区更改

如何将 EBS 卷与 ECS 容器一起使用

在构建时使用 docker-compose 将环境变量传递给 docker 映像

使用 docker-compose 的 Elastic Beanstalk Docker 私有注册表

使用 docker-compose 将 Docker 映像部署到谷歌云运行

尝试通过 docker-compose 将 NodeJS 应用程序连接到 MySQL 映像时出现 ECONNREFUSED