我想知道人们如何使用docker进行生产和开发。在开发中,我想挂载我的源/构建文件,以便能够快速轻松地进行更改。对于生产,我想在图像中包含源/构建文件。
这通常是如何完成的,是否有最佳或更常见的做法?
在我看来,理想情况下我会有一个Dockerfile使用类似标志或环境变量的东西来设置prod或dev图像,但我找不到任何人这样做的例子,我不知道究竟是怎么回事会做的。
我还看到了一些用于生产和开发的具有独特Dockerfiles的项目的粗略示例,但是如果我们不小心的话,还有维护单独的Dockerfiles的问题,这可能会随着时间的推移发生分歧。
这些都是明智的还是我可能误解了什么?我对码头工人比较新。使用类似设置的示例Dockerfile或项目会很棒。我一开始就担心将一些服务与不良做法对接。
编辑:如果影响任何回复,我当前所有的应用都是python base。
答案 0 :(得分:3)
除了Kevin Wittek的出色答案之外,事实证明这可能更不是一个问题。
我可以使用COPY
将文件复制到图像中,但我可以简单地将它们安装在它们之上进行开发。
如果还需要安装dev-only deps之类的其他内容,我可以使用ARG
指定类似ARG APP_ENV=prod
的环境,并使用--build-arg=dev
覆盖或{反之亦然。
答案 1 :(得分:2)
一个好的方法是使用Docker的multi-stage builds,因为它们允许您在包含dev依赖项的图像内构建工件,并且只在最终图像中使用工件和运行时依赖项。
我通常建议不要在不同的环境中使用不同的Dockerfiles,这通常应该使用配置参数来实现(环境变量是一个很好的解决方案)。
拥有更快的开发反馈周期取决于IMO在使用的语言上的重要性。许多人将以更经典的方式使用IDE进行开发,并且仅为集成测试等构建映像(根据我的经验,例如Java开发人员通常就是这种情况)。其他解释型语言确实可以从将源安装到开发环境映像中获益。在这种情况下,您可能会将此图像合并到多阶段构建中。