Docker组成生产和开发

所以我使用Python + Django(但是这个问题并不重要)

当我写我的代码,我只是运行

./manage.py runserver 

其中的networking服务器,静态文件,自动重新加载等

并把它放在生产上我使用一系列的命令

 ./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,并在dev另一个..

有什么最好的做法来实现呢?

您应该创build像docker-compose-dev.yml或docker-compose-pro.yml这样的其他docker-compose.yml文件,并使用-f命令覆盖一些原始的docker-compose.ymlconfiguration:

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

有时,我也在不同的环境中使用不同的Dockerfile,并在dockerfile -compose-pro.yml构build部分中指定dockerfile参数,但是我不推荐它,因为您将以重复的Dockerfiles结束。

通常有不同的生产和开发启动工作stream程是一个坏主意。 你应该总是尽量保持dev和prod环境非常相似,即使你启动应用程序的方式也是如此。 您应始终将不同环境之间的configuration外部化。

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

但是,您可能有一些限制。 Docker-compose允许你重写在图像中指定的命令。 命令属性将覆盖图像中的默认命令。 我会build议你保持图像的生产准备,即使用类似CMD ./manage.py collectstatic && ./manage.py migrate && uwsgi --http 127.0.0.1:8000 -w wsgi --processes=4在Dockerfile 。

在撰写文件中,通过指定以下内容来覆盖CMD:

 command: ./manage.py runserver 

有多个撰写文件通常不是一个大问题。 你可以通过使用一些很好的组合文件function来保持你的组合文件的清洁和可pipe理性,如扩展,一旦组合文件可以扩展另一个。