django - docker-compose 相同的配置用于开发和生产,但仅在开发中启用主机和容器之间的代码共享
问题描述
由于使用 docker 最重要的好处是保持 dev 和 prod env 相同,所以让我们排除使用两个不同的选项docker-compose.yml
假设我们有一个 Django 应用程序,我们gunicorn
用于生产环境,我们有一个专用的 apache2 作为反向代理(这个 apache2 在设计上不属于 docker)。所以这个应用程序(docker-compose)只有两个部分,web
(Django)和db
(mysql)。db 部分没有任何问题。
对于 Django 部分,没有 docker 的开发例程将使用 venvpython3 manage.py runserver
或 IDE 提供的任何快捷方式。我们可以愉快地更改我们的代码,开发服务器很聪明,可以立即进行更改和反映。
当 docker 出现时事情变得很棘手,因为所有源代码都应该打包到镜像中,这给我们的开发人员带来了一次又一次重新创建镜像和容器的巨大开销。可能有以下解决方案(我发现它不优雅):
在
docker-compose.yml
使用卷挂载源代码文件夹到容器中,这样宿主源代码文件夹中的所有更改都会自动反映到容器中,然后gunicorn
会拾取更改并反映。--- 这确实消除了大部分重新创建容器的开销,但我们不能docker-compose.yml
在生产中使用它,因为这会引入对主机服务器上源代码的依赖。我知道有一个命令行选项可以将主机文件夹挂载到容器,但据我所知,这个选项只存在于
docker run
notdocker-compose
. 因此,使用不同的命令在不同的环境中启动服务是另一个死胡同。(我不是 100% 确定这一点,因为我对 docker 还是很陌生,如果我错了,请纠正我)
TLDR;如何设置我的环境,以便
- 我只
docker-compose.yml
为 dev 和 prod使用一个 - 我无需重新创建 docker 容器即可轻松开发实时更改
非常感谢!
解决方案
我也喜欢将尽可能多的功能塞进一个 docker-compose.yml 文件中。我会考虑的一些策略:
为 prod 和 dev 定义不同的服务。所以你会跑
docker-compose up dev
ordocker-compose up prod
ordocker-compose run dev
。这里有一些复制,但通常不会很多。使用多个 docker-compose.yml 文件并将它们合并。例如:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
。更多详细信息:https ://docs.docker.com/compose/extends/
我通常只是注释掉我的卷部分,但这可能不是最好的解决方案。
推荐阅读
- python - 如何在 django 中没有模型的情况下从数据库 mongodb 获取数据?
- hyperlink - 锚链接在 Chrome 和 Safari 的同一页面上出现错误的位置,但在 Firefox 中一切正常
- amazon-web-services - AWS SES w/ Lambda - 测试通过 SES 仪表板发送电子邮件的工作原理。API 调用在不同的环境中抛出 404 和 405。教程跟随
- sql - 如果出现空值,我可以使用什么 sql 语句?
- python - 有没有办法从python中的html标签中获取数据?
- javascript - Django Rest Framework 如何在另一种方法中调用变量?
- python-3.x - 如何修复 M1 Mac 上 CyLP 的导入错误?
- mongodb - 通过 REST API 将 MongoDB 与 React Native 连接
- javascript - 如何循环遍历对象数组并在下拉列表中显示
- c# - 如何获取 JObject 的根名称