所以我使用Python + Django(但这对于这个问题并不重要)
当我编写代码时,我只需运行
./manage.py runserver
执行网络服务器,静态文件,自动重新加载等
并且将其置于生产我使用一系列命令,如
./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而在另一个中运行另一个...
实现这一目标的最佳做法是什么?
答案 0 :(得分:4)
您应该创建其他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结束。
答案 1 :(得分:1)
通常有不同的制作和开发工作流程是一个坏主意。您应该始终尝试使dev和prod环境非常相似,即使在启动应用程序的方式中也是如此。您应该始终外部化不同环境之间不同的配置。
具有不同的启动顺序可能是可接受的,但是对于每个环境具有多个docker镜像(或dockerfiles)是一个非常糟糕的主意。 Docker镜像应该是不可变的和可移植的。
但是,您可能会遇到一些限制。 Docker-compose允许您覆盖图像中指定的命令。有command property将覆盖图像中的默认命令。我建议您准备好图像制作,
即在Dockerfile中使用CMD ./manage.py collectstatic && ./manage.py migrate && uwsgi --http 127.0.0.1:8000 -w wsgi --processes=4
之类的东西。
在撰写文件中,只需指定:
即可覆盖CMDcommand: ./manage.py runserver
拥有多个撰写文件通常不是一个大问题。您可以使用一些不错的compose file features(例如extends)来保持您的撰写文件的清晰和可管理性,其中一旦撰写文件可以扩展另一个文件。