Docker compose 用于生产和开发

问题描述 投票:0回答:3

所以我用的是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并且在开发中运行另一个..

实现这一目标的最佳实践是什么?

django docker docker-compose production
3个回答
25
投票

您应该创建额外的 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

有时,我也会为不同的环境使用不同的Dockerfile,并在docker-compose-pro.yml 构建部分指定

dockerfile
参数,但我不推荐这样做,因为你会以重复的Dockerfiles结束。

更新

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


0
投票

Docker Compose 可以根据

.env
文件的内容构建生产环境或开发环境。

build:
文件中每个
service
compose.yaml
指令允许您指定用于构建服务的Dockerfile。例如,使用
dockerfile:${nginx_Dockerfile}
。每项服务需要两个
Dockerfile
- 一个
dev
,另一个
prod
.

这允许您使用相同的

compose.yaml
来构建两个环境,具体取决于您的
.env
文件的内容。


-1
投票

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

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

但是,您可能会有一些限制。 Docker-compose 允许您覆盖图像中指定的命令。有 command 属性 将覆盖图像中的默认命令。我建议您准备好图像制作, 即在 Dockerfile 中使用像

CMD ./manage.py collectstatic && ./manage.py migrate && uwsgi --http 127.0.0.1:8000 -w wsgi --processes=4
这样的东西。

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

command: ./manage.py runserver 

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

© www.soinside.com 2019 - 2024. All rights reserved.