使用Gunicorn在Docker中自动重新加载Django开发中的代码更改

我为Django开发使用了一个Docker容器,容器使用Nginx运行Gunicorn。 我想代码更改为自动加载,但我可以让他们加载的唯一方法是通过docker-compose( docker-compose build )进行重build。 “构build”的问题是,它重新运行所有我的点安装。

我正在使用--reload标志,这显然是应该做我想要的。 这里是我的Dockerconfiguration文件:

 ## Dockerfile: FROM python:3.4.3 RUN mkdir /code WORKDIR /code ADD . /code/ RUN pip install -r /code/requirements/docker.txt ## docker-compose.yml: web: restart: always build: . expose: - "8000" links: - postgres:postgres volumes: - /usr/src/app/static env_file: .env command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload nginx: restart: always build: ./config/nginx ports: - "80:80" volumes: - /www/static volumes_from: - web links: - web:web postgres: restart: always image: postgres:latest volumes: - /var/lib/postgresql ports: - "5432:5432" 

我已经尝试了一些其他的Docker命令( docker-compose restartdocker-compose up ),但代码不会刷新。

我错过了什么?

感谢kikicarbonell,我研究了一下我的代码的体积,并且在看了Docker Compose推荐的Django设置之后 ,我在docker-compose.yml中添加了volumes: - .:/code到我的web容器,现在任何代码更改我使自动应用。

 ## docker-compose.yml: web: restart: always build: . expose: - "8000" links: - postgres:postgres volumes: - /usr/src/app/static - .:/code env_file: .env command: /usr/local/bin/gunicorn myapp.wsgi:application -w 2 -b :8000 --reload 

更新:有关Docker使用Gunicorn和Django的完整示例,请查看Rackspace的这个示例项目 ,该示例项目还展示了如何使用docker-machine在Rackspace Cloud等远程服务器上启动安装程序。

警告:目前,当您的代码在本地,并且docker主机是远程的(例如,在Digital Ocean或Rackspace等云提供商上)时,此方法不起作用。 如果您的本地文件系统未安装在虚拟机上,这也适用于虚拟机。 请注意,有单独的音量驱动程序(如flocker),并可能有东西在那里解决这个需要。 目前,“修复”是rsync / scp文件直到远程docker主机上的一个目录。 然后,–reload标志将在任何scp / rsync之后自动重新加载gunicorn。 更新:如果推码来删除docker主机,我发现重builddocker容器(例如, docker-compose build web && docker-compose up -d )容易得多。 如果你的src文件夹很大,这可能比rsync方法慢。

你还有另外一个问题 – Dockercaching它构build的每一层。 你不应该每次都要重新运行pip安装!

 ADD . /code/ RUN pip install -r /code/requirements/docker.txt 

这是你的问题 – Docker检查每个ADD语句,看看是否有文件发生了变化,并为caching和后续步骤(如果有的话)无效。 正确的方法是…

 ADD ./requirements/docker.txt /code/requirements/ RUN pip install -r /code/requirements/docker.txt ADD ./code/ 

如果您的需求文件发生变化,这将只会使您的pip安装行无效!