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

时间:2016-03-27 08:16:22

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

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

目标是让不同的postgres容器共享相同的持久化数据(不同时!) - 一个容器死亡或被杀死,另一个容器在不丢失先前持久化数据的情况下取而代之。

据我了解"命名卷"应该取代" Data Volume Containers"。 但是,到目前为止,要么发生以下两种情况之一:

  1. postgres容器无法启动,错误消息" ERROR:找不到容器命令或不存在。"
  2. 我只为那个特定的容器实现了持久性。如果它被停止并被移除并且另一个容器已启动,我们将从一个空白的平板开始。
  3. 因此,据我所知,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

2 个答案:

答案 0 :(得分:2)

好的,经过大量的反复试验后,事情正在按原样运行(意味着我可以运行docker-compose down然后docker-compose up,我的数据处于剩下的状态使用down命令。)

一般来说,有一些事情:

  1. 不要将PGDATA环境选项与官方postgres image
  2. 一起使用
  3. 如果使用spring boot(就像我一样)和docker compose(就像我一样)并将environment选项传递给链接到数据库容器的服务,请不要将配置文件名称用双引号括起来。它按原样传递给Spring,导致不存在的配置文件用作活动配置文件。
  4. 我最初错误地配置了一些微妙和奇怪的东西,但我怀疑杀手是上面的第2点 - 它导致我的应用程序,当在容器中运行时,使用in-mem H2数据库而不是链接的容器数据库。所以一切都(几乎)完美地运行 - 直到容器关闭。而且,当从IDE运行时,针对容器DB(端口暴露给主机),所有工作都完美(包括持久性),因为在IDE启动器中正确设置了活动配置文件参数(无引号!)。

    生活和学习我猜(但我觉得我的脸上有很多鸡蛋)。

答案 1 :(得分:0)

您需要告诉Compose它应该管理卷的创建,否则它假定它应该已经存在于主机上。

volumes:
  myappdb:
    external: false

文档:https://docs.docker.com/compose/compose-file/#external