繁体   English   中英

docker-为开发和生产组成相同的配置,但仅在开发中启用主机和容器之间的代码共享

[英]docker-compose same config for dev and production but enable code sharing between host and container only in development

由于使用docker的最重要好处是使dev和prod env保持相同,因此我们排除使用两个不同docker-compose.yml的选项

假设我们有一个Django应用程序,我们使用gunicorn进行生产,并且有一个专用的apache2作为反向代理(该apache2在设计上超出了docker)。 因此,此应用程序(docker-compose)只有两部分,即web (Django)和db (mysql)。 数据库部分没有任何问题。

对于Django部分,没有docker的dev例程将使用venv和python3 manage.py runserver或IDE提供的任何快捷方式。 我们可以愉快地更改我们的代码,开发服务器很聪明,可以立即进行更改和反映。

当docker进入时,事情变得棘手,因为所有源代码都应打包到映像中,这给我们的开发人员带来了很大的开销,需要一次又一次地重新创建映像和容器。 一个人可能有以下解决方案(我发现这不是很优雅):

  • docker-compose.yml使用volume将源代码文件夹安装到容器中,以便主机源代码文件夹中的所有更改将自动反映在容器中,然后gunicorn将拾取更改并进行反映。 ---这确实消除了大多数重新创建容器的开销,但是我们不能在生产中使用相同docker-compose.yml ,因为这会引入对主机服务器源代码的依赖性。

  • 我知道有一个命令行选项可将主机文件夹安装到容器,但据我所知,此选项仅存在于docker run而不存在于docker-compose 因此,使用不同的命令在不同的环境中启动服务是另一个死角。 我对此不是100%的确定,因为我对docker还是很陌生,如果我错了,请纠正我

TLDR; 我该如何设置我的环境

  • 我仅对dev和prod使用一个docker-compose.yml
  • 我无需重新创建Docker容器即可轻松进行实时更改

非常感谢!

我还喜欢将尽可能多的功能添加到单个docker-compose.yml文件中。 我会考虑一些策略:

  1. 为产品和开发人员定义不同的服务。 因此,您将运行docker-compose up devdocker-compose up proddocker-compose run dev 这里有一些复制品,但通常不是很多。

  2. 使用多个docker-compose.yml文件并将其合并。 例如: docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d 此处有更多详细信息: https : //docs.docker.com/compose/extends/

我通常只是注释掉我的卷部分,但这可能不是最好的解决方案。

docker-compose.yml中将django服务定义为

services:
  backend:
    image: backend

然后为dev添加文件: docker-compose.dev.yml

services:
  backend:
    extends:
      file: docker-compose.yml
      service: backend
    volume: local_path:path

要启动产品,只需docker-compose up

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

要热重载dev django应用,只需重载gunicorn ps aux | grep gunicorn | grep greencar_proj | awk '{ print $2 }' | xargs kill -HUP ps aux | grep gunicorn | grep greencar_proj | awk '{ print $2 }' | xargs kill -HUP

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM