使用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 restart
, docker-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安装行无效!