一尘不染

多个Docker容器,相同的映像,不同的配置

docker

我是Docker的新手,感谢您的耐心配合。

我正在寻找一种方法来部署具有相同映像的多个容器,但是我需要向每个容器传递不同的配置(文件)?

现在,我的理解是,一旦构建了映像,就可以部署它,但是对我来说,问题是,当相同的应用程序之间的配置不同时,我看不到构建同一应用程序的多个映像的意义。容器。

如果这是正常现象,那么我将不得不处理它,但是,如果还有其他方法,请让我摆脱痛苦!:)

谢谢!


阅读 1000

收藏
2020-06-17

共1个答案

一尘不染

我认为查看易于理解的示例可以为您提供最好的画面。

您要做的是完全有效的,映像应该是您需要运行的任何内容,而无需进行配置。

要生成配置,您可以:


a)体积安装

使用卷并在容器启动期间挂载文件docker run -v my.ini:/etc/mysql/my.ini percona(与相似docker- compose)。请注意,您可以根据需要多次重复此操作,因此可以将多个配置装入 容器中
(因此映像的运行时版本)。您将在运行容器之前在主机上创建这些配置,并且需要将这些文件与容器一起运送,这是此方法的缺点(可移植性)

b)基于入口点的配置(生成)

大多数高级Docker映像确实提供了一个复杂的入口点,该入口点消耗了启动映像时传递的ENV变量来为您创建配置,例如https://github.com/docker-
library/percona /blob/master/5.7/docker-
entrypoint.sh

因此,当您运行此映像时,您可以执行docker run -e MYSQL_DATABASE=myapp percona此操作,这将启动percona并为您创建数据库percona。这一切都由

  1. 在此处添加入口点脚本https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L65
  2. 不要忘记在映像构建期间复制脚本https://github.com/docker-library/percona/blob/master/5.7/Dockerfile#L63
  3. 然后在图像启动期间,您的ENV变量将导致此事件触发:https : //github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91

当然,您可以随心所欲地做任何事情。例如,这将配置一个常规的门户图像:https : //github.com/EugenMayer/docker-rancher-extra-
catalogs/blob/master/templates/registry-slim/11/docker-
compose.yml
具有此入口点https:/ /github.com/EugenMayer/docker-image-
portus/blob/master/build/startup.sh

因此,您会看到,切入点策略非常普遍且功能强大,我想尽可能地走这条路。

c)衍生图像

也许是出于“完整性”(源自图像的策略)的考虑,因此您将基于“ myapp”的图像作为基础,并为安装X创建了新图像

from myapp
COPY my.ini /etc/mysql/my.ini
COPY application.yml /var/app/config/application.yml

并将此图像称为myapp:x-显而易见的问题是,与a)相比,您最终拥有很多图像,而a)它的可移植性更高。

希望能有所帮助

2020-06-17