【问题标题】:Config files on a docker image shared with multiple containers与多个容器共享的 docker 映像上的配置文件
【发布时间】:2019-04-05 08:21:56
【问题描述】:

我使用 Docker 运行 PHP 软件的不同实例。每个实例都有自己的数据库容器、应用程序容器、docker-compose 文件等(没有 swarm、kubernetes 或任何类型的编排)。

我必须在 /usr/local/etc/php/conf.d/ 上包含一些自定义设置。我需要更改一个文件的内容,并添加另一个文件。

这就是我目前在 docker-compose 上实现这一目标的方式:

volumes:
  - "./conf/disable-opcache.ini:/usr/local/etc/php/conf.d/opcache-recommended.ini:z"
  - "./conf/custom.ini:/usr/local/etc/php/conf.d/custom.ini:z"

它有效,但迫使我为应用程序的每个实例都拥有这两个文件的副本。当我想进行更改时,我需要将它们复制到每个实例。

我希望以一种简单、便携、可复制的方式将这些自定义项放置在这些容器的多个实例上。

我已经阅读了this answer,我目前所做的基本上是他们的选项 (a),但它具有我提到的所有缺点。我不能使用选项 (b),因为我使用的图像不支持 - 至少不支持我需要的所有自定义配置;而对于选项 (c),我需要为我们使用的每个图像的每个版本/标签创建一个自定义派生图像。

我尝试的是创建一个仅包含配置文件的映像,并将其添加为一个卷。如果该卷是一个文件夹,它可以工作,但是它会“覆盖”原始文件夹并且只存在这两个自定义文件,而我需要文件夹中的其他原始文件也存在。

如果我尝试将单个文件用作卷,它将不起作用。

我想我可以将所有文件放在一个卷中的一个新图像中,然后在容器上创建指向每个文件的符号链接。但我不确定如何在容器上创建这些符号链接。

可能有更好的方法可以继续,但不幸的是我被卡住了。

【问题讨论】:

  • 我没有添加这个作为答案,因为你说你没有考虑 swarm。但是,您可以在本地使用 swarm,无需集群(使用:docker swarm init),它仍然可以读取您的撰写文件,然后您可以使用为解决您的确切问题而创建的“配置”功能:docs.docker.com/engine/swarm/configs
  • @EngineerDollery 我不知道这个功能。或者您可以在 swarm 中运行单个“节点”。这似乎确实是最优雅和合乎逻辑的方法。请写一个anwser,我会接受的。
  • 如果你将每个实例都挂载在一个文件上,它不会起作用?

标签: docker


【解决方案1】:

也许您应该尝试使用swarm configuration service:根据您的描述,我认为这将有助于您前进。

您可以在单个“节点”(您的本地计算机)上使用 swarm,并继续使用您的撰写文件。使用:docker swarm init 开始。

您将disable-opcache.ini 文件添加到服务中,如下所示:

docker config create dopcache disable-opcache.ini

然后使用类似这样的方法将配置传递给您的容器:

docker service create \
   --name myphpapp \
   --config source=dopcache,target=/usr/local/etc/php/conf.d/opcache-recommended.ini,mode=0440 \
   -c my-docker-compose.yml \
   myphpimage:latest \

【讨论】:

  • 听起来很有希望,我会尝试并回来接受答案。谢谢! :-)
猜你喜欢
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 2019-01-02
  • 2018-05-08
  • 2015-05-24
  • 2020-11-11
  • 2016-11-26
  • 1970-01-01
相关资源
最近更新 更多