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