Docker 为生产和开发编写

Docker compose for production and development

所以我用的是Python+Django(不过这道题其实并不重要)

当我编写代码时,我只是 运行

./manage.py runserver 

网络服务器、静态文件、自动重新加载等

并把它放在 production 我使用一系列命令,比如

./manage.py collectstatic
./manage.py migrate
uwsgi --http 127.0.0.1:8000 -w wsgi --processes=4

我还有一些其他服务,如 postgres、redis(这对生产和开发都很常见)

所以我试图在此处进行调整 docker(+ -compose),但我无法理解如何拆分 prod/dev。

基本上在 docker-compose.yml 中你定义你的服务和图像 - 但在我的例子中,生产中的图像应该 运行 一个 CMD 而在开发中另一个..

实现该目标的最佳做法是什么?

您应该创建额外的 docker-compose.yml 文件,例如 docker-compose-dev.yml 或 docker-compose-pro.yml 和使用 -f 命令覆盖一些原始 docker-compose.yml 配置:

docker-compose -f docker-compose.yml -f docker-compose-dev.yml up -d

有时,我也会为不同的环境使用不同的Docker文件,并在docker-compose-pro.yml构建部分指定dockerfile参数,但我没有推荐它,因为您将以重复的 Docker 文件结束。

更新

Docker 引入了多阶段构建功能 https://docs.docker.com/develop/develop-images/multistage-build/#use-multi-stage-builds,允许为不同的环境创建 Docker 文件。

通常采用不同的生产和开发启动工作流程不是一个好主意。您应该始终尝试使开发环境和生产环境非常相似,即使在启动应用程序的方式上也是如此。您应该始终外部化不同环境之间不同的配置。

具有不同的启动顺序也许是可以接受的,但是对于每个环境具有多个 docker 图像(或 docker 文件)是一个非常糟糕的主意。 Docker 图像应该是不可变的和可移植的。

但是,您可能有一些限制。 Docker-compose 允许您覆盖图像中指定的命令。 command property 将覆盖图像中的默认命令。我建议您准备好图像制作, 即在 Docker 文件中使用类似 CMD ./manage.py collectstatic && ./manage.py migrate && uwsgi --http 127.0.0.1:8000 -w wsgi --processes=4 的内容。

在撰写文件中,只需通过指定覆盖 CMD:

command: ./manage.py runserver 

拥有多个撰写文件通常不是什么大问题。您可以通过使用一些不错的 compose file features(例如扩展)来保持您的撰写文件的清洁和可管理性,其中一次撰写文件可以扩展另一个。