docker - 如何将镜像创建的卷与 docker-compose 指定的命名卷链接起来?

标签 docker spring-boot docker-compose postgresql-9.4

我一直在尝试使用 docker-compose 来启动 postgres container容器,具有单个持久命名卷。

目标是让不同的 postgres 容器共享相同的持久数据(不是同时!) - 一个容器死亡或被杀死,另一个容器取代它,而不会丢失以前的持久数据。

据我了解,“命名卷”应该取代“数据卷容器”。 但是,到目前为止,发生了以下两种情况之一:

  1. postgres 容器启动失败,并显示错误消息“错误:容器命令未找到或不存在。”
  2. 我仅实现了该特定容器的持久性。如果它被停止并删除并且另一个容器启动,我们将从一张白纸开始。

据我了解,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 命令留下的状态。

总的来说,有以下几点:

  1. 请勿将 PGDATA 环境选项与官方 postgres image 一起使用
  2. 如果使用 spring boot(就像我一样)和 docker compose(就像我一样)并将 environment 选项传递给链接到数据库容器的服务,请勿将配置文件名称用双引号引起来。它按原样传递给 Spring,从而导致将不存在的配置文件用作事件配置文件。

我最初配置了一些微妙而奇怪的事情,但我怀疑 killer 是上面的第 2 点 - 它导致我的应用程序在容器中运行时使用内存中的 H2 数据库而不是链接的容器数据库。所以一切都(几乎)完美地运行 - 直到容器关闭。而且,当从 IDE 运行时,针对容器数据库(端口暴露给主机),所有操作都完美运行(包括持久性),因为事件配置文件参数已在 IDE 启动器中正确设置(无引号!)。

生活和学习我猜(但我确实感觉脸上有很多鸡蛋)。

关于docker - 如何将镜像创建的卷与 docker-compose 指定的命名卷链接起来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36245276/

相关文章:

linux - 如何在 Linux 中运行 asp dot net core 图像?

docker - 无法打开在端口上运行的 docker 应用程序

java - 如何检查文件是否是目录,递归地对其子目录及其内容执行相同操作并将它们复制到另一个位置

docker - 使用env变量的docker run和docker-compose运行命令

docker - 在 Dockerfile 中覆盖 FROM 镜像的 ENV

ruby-on-rails - 无法访问 Assets - dockerized Rails 应用程序,nginx 作为反向代理

java - SpringBoot 无法 Autowiring 。 Mapstruct 映射器未找到 'UserMapper' 类型的 beans 错误

mysql - JPA Hibernate 双向关系以空指针结束

elasticsearch - 使用 docker 环境变量在 elasticsearch 中启用身份验证

尝试在本地安装 Shopware 6 时,Docker for Windows "The system cannot find the path specified"