多个Docker容器,相同的图像,不同的configuration

我对Docker是全新的,所以我感谢你的耐心。

我正在寻找一种方式来部署多个容器与相同的图像,但是我需要传递给每个不同的configuration(文件)?

现在,我的理解是,一旦你build立一个图像,这就是部署,但是我的问题是,我没有看到build立同一个应用程序的多个图像的时候,只有configuration是不同的容器。

如果这是常态,那么我将不得不面对,但如果有另一种方式,请把我从痛苦中解救出来! 🙂

谢谢!

我觉得看看容易理解的例子可以给你最好的照片。

你想要做的是完全有效的,一个图像应该是任何你需要运行,没有configuration。

要生成configuration,您可以:


a)卷装

使用卷并在容器启动docker run -v my.ini:/etc/mysql/my.ini percona期间装载文件docker run -v my.ini:/etc/mysql/my.ini percona (以及类似于docker run -v my.ini:/etc/mysql/my.ini percona docker-compose )。 请注意,你可以随心所欲地重复这个操作,所以你可以在你的容器中安装几个configuration文件(运行时版本的图像)。 您将在运行容器之前在主机上创build这些configuration,并需要将这些文件与容器一起发运,这是这种方法的缺点(可移植性)

b)基于入口点的configuration(生成)

大多数先进的docker图像提供了一个复杂的所谓的入口点,它会消耗启动图像时传递的ENVvariables,为您创buildconfiguration,比如https://github.com/docker-library/percona /blob/master/5.7/docker-entrypoint.sh

所以当你运行这个镜像时,可以执行docker run -e MYSQL_DATABASE=myapp percona ,这将启动percona并为你创build数据库percona。 这一切都是通过

  1. 在这里添join口点脚本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. 然后在映像启动过程中,您的ENVvariables会导致触发: https : //github.com/docker-library/percona/blob/master/5.7/docker-entrypoint.sh#L91

当然,你可以做任何你喜欢的事情。 例如,这configuration了一个通用的portus映像: 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创build一个新的形象

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

并把这个图像称为myapp:x – 这个问题的明显问题是,与其他方面相比,最终会产生大量的图像,而a)更便于携带。

希望有所帮助

每个容器都运行相同的RO映像,但具有RW容器特定的文件系统层。 结果是每个容器都可以拥有与其他容器不同的自己的文件。

您可以在CLI中传递configuration,作为环境variables或独特的卷装载。 对于Docker来说,这是一个非常标准的用例。