我正在为我们的服务器构建 docker 映像,并且在创建 DOCKERFILE(s) 时,我正在寻找与多环境支持相关的最佳实践。
服务器的主要目的是在 Centos 6 上运行 LAMP,我想让 DOCKERFILE(s) 尽可能通用以支持开发和生产环境。这些图像将有很多常见的配置/实用程序,以及一些差异。
差异例如:
- 仅限生产:监控工具、防病毒软件和不同的 LAMP 配置
- 仅限开发:xdebug、分析工具和不同的 LAMP 配置
我考虑过使用类似以下结构的东西:
- 定制基础操作系统 (C1)
- 产品。基本操作系统 (C1E1)
- 开发。基本操作系统 (C1E2)
- Web 图像(httpd、apache..)(C2)
- 产品。调整(C2E1)
- 开发。调整(C2E2)
- 数据库映像 (C3)
- 产品。调整(C3E1)
- 开发。调整(C3E2)
- 数据图像 (C4)
- 产品。调整(C4E1)
- 开发。调整(C4E2)
- Samba 映像(仅限开发人员)(C5)
但是如你所见,用目前的继承机制是不可能做到的,即使做到了,也是不可维护的。
我找不到在 DOCKERFILE 中使用 ENV 条件的方法(例如,仅在 RUN 命令中使用基于 Linux 的条件)。
目前我正在使用以下结构:
- Base Image(常用的东西,比如LAMP、utils..)
- 开发。图片(开发者特定的工具/配置)
- 产品。图片(产品特定的......)
上述是否有任何最佳实践?图像重复(双重维护)是唯一的可能性吗?
Docker 的概念之一是拥有相同的环境——如果生产环境与开发环境不同,那么当应用程序投入生产时,你不知道它是否会完全确定地工作。
来自 docker.com:
也就是说,生产和开发当然会有差异,但这主要是在应用程序配置方面——例如,开发实例不会向客户发送电子邮件,而是向虚拟邮箱等发送电子邮件。
我认为在生产和开发之间存在如此大的差异,就像您在帖子中提到的那样,这不是正确的做法。
至于开发和生产配置之间的区别(就像我上面给出的示例),我个人认为有两种可行的方法。
在 Dev 中,一个 Dockerfile 覆盖生产和开发的公共基础的某些配置。
您的容器运行一些东西——启动 httpd 等。启动该过程的脚本将首先根据环境变量(例如
docker run ... -e RUNAS=PROD ...
)从 Git 或任何存储库中提取配置——这就是我所做的。在我的例子中,为 Tomcat 运行一个容器,Tomcat 启动脚本只是根据环境变量(例如-e VERSION=current
)下载 war 文件版本,并根据定义它是生产还是开发(-e RUNAS=DEV
)的变量从 Git 中提取配置文件。