gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:45:54 25 4
gpt4 key购买 nike

由于使用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提供的任何快捷方式。我们可以很高兴地更改代码,开发服务器很聪明,可以立即进行更改和反射(reflect)。

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

  • docker-compose.yml中,使用卷将源代码文件夹安装到容器中,以便主机源代码文件夹中的所有更改都将自动反射(reflect)在容器中,然后gunicorn将拾取更改并进行反射(reflect)。 ---这确实消除了大多数重新创建容器的开销,但是我们不能在生产中使用相同的docker-compose.yml,因为这会给主机服务器上的源代码带来依赖性。
  • 我知道有一个命令行选项可以将主机文件夹挂载到容器,但是据我所知,此选项仅存在于docker run中,不存在于docker-compose中。因此,使用不同的命令在不同的环境中启动服务是另一个死角。 (我对此不是100%的确定,因为我对Docker还是很陌生,如果我错了,请纠正我)

  • TLDR;
    我该如何设置环境
  • 我仅将一个docker-compose.yml用于dev和prod
  • 我能够轻松进行实时更改,而无需重新创建docker容器

  • 非常感谢!

    最佳答案

    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
    为开发者启动 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

    关于django - docker-为开发和生产组合相同的配置,但仅在开发中启用主机和容器之间的代码共享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54183652/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com