构buildDocker镜像以支持多环境

我正在为我们的服务器构builddocker镜像,并且在创buildDOCKERFILE时寻找与多环境支持相关的最佳实践。

服务器的主要目的是在Centos 6之上运行LAMP,并且要使DOCKERFILE尽可能通用,以支持开发和生产环境。 图像将有很多常见的configuration/使用情况,并有一些差异。

差异例如:

  • 仅限制作:监视工具,AntiVirus和不同的LAMPconfiguration
  • 仅开发:xdebug,剖析utils和不同的LAMPconfiguration

我想过使用如下结构的东西:

  • 定制的基本操作系统(C1)
    • PROD。 基本操作系统(C1E1)
    • 开发。 基本操作系统(C1E2)
  • Web图像(httpd,apache ..)(C2)
    • PROD。 调整(C2E1)
    • 开发。 调整(C2E2)
  • DB图像(C3)
    • PROD。 调整(C3E1)
    • 开发。 调整(C3E2)
  • 数据图像(C4)
    • PROD。 调整(C4E1)
    • 开发。 调整(C4E2)
  • Samba映像(仅限dev)(C5)

但是正如你所看到的那样,用现有的inheritance机制是不可能的,即使是这样,也是不可维护的。

我找不到在DOCKERFILE中使用ENV条件的方法(例如,仅在RUN命令中的基于Linux的条件下)。

目前我正在使用以下结构:

  • 基础图像(常见的东西,如LAMP,utils ..)
    • 开发。 图像(开发特定的使用情况/configuration)
    • PROD。 Image(Prod。specific …)

以上是否有最佳做法? 图像的重复(双重维护)是唯一的可能性?

Docker的概念之一就是拥有相同的环境 – 如果生产环境与开发环境不同,那么当应用程序迁移到生产环境中时,您并不知道它确实能够完全确定地工作。

从docker.com:

消除环境不一致

通过将应用程序与其configuration和依赖关系一起打包并作为容器运输,应用程序将始终按照本地devise,在另一台机器上,在testing或生产中运行。 不必担心必须将相同的configuration安装到不同的环境中。

也就是说,生产和开发当然会有差异,但是这应该主要是应用程序configuration方面 – 例如,开发实例不会向客户发送电子邮件,而是向虚拟邮箱发送电子邮件等。

我不认为这是正确的事情做生产和开发之间有如此多的差异,你在你的职位去了。

至于开发和生产configuration的区别(就像我上面给出的例子),我个人看到了两种可行的方法。

  1. 在开发中,一个Dockerfile覆盖了生产和开发的共同基地的某些configuration。

  2. 你的容器运行的东西 – 启动httpd等等。启动进程的脚本将首先从Git或任何存储库,基于环境variables(例如docker run ... -e RUNAS=PROD ... ) – – 这个就是我所做的 在我的情况下,为Tomcat运行一个容器,Tomcat启动脚本只需根据环境variables(例如-e VERSION=current )下载war文件版本,然后从Git中根据定义它是否正在生产的variables或dev( -e RUNAS=DEV )。