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(例如扩展)来保持您的撰写文件的清洁和可管理性,其中一次撰写文件可以扩展另一个。
所以我用的是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(例如扩展)来保持您的撰写文件的清洁和可管理性,其中一次撰写文件可以扩展另一个。