我正在使用Docker容器进行Django开发,容器使用Nginx运行Gunicorn。我希望代码更改为自动加载,但我可以加载它们的唯一方法是使用docker-compose(docker-compose build
)重建。 “build”的问题在于它会重新运行我的所有pip安装。
我正在使用Gunicorn --reload
旗帜,这显然应该按我的意愿行事。这是我的Docker配置文件:
## 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
),但代码不会刷新。
我错过了什么?
答案 0 :(得分:1)
由于我从未找到理想的解决方案,因此请考虑这个有趣的技巧。在这里发布信息,我想看看是否有人对此“变通办法”有类似/好/不好的经验。
要使代码在本地重新加载以进行开发,我只创建了一个立即调用exit()
的View。退出将使Django崩溃,并在有代码更改的地方进行重新加载。重新启动只需花费一秒钟的时间,可以通过浏览器中的选项卡,requests.get
调用或任何其他类似的调用来完成。重新加载不是自动的,但会跳过任何Docker延迟,例如重启。
调用出口时,您将看到PID增量(如果拖尾记录):
web | [2019-07-15 18:29:52 +0000] [22] [INFO] Worker exiting (pid: 22)
web | [2019-07-15 18:29:52 +0000] [24] [INFO] Booting worker with pid: 24
我希望这可以帮助其他人和/或反馈这种方法。
答案 1 :(得分:0)
我遇到了非常相似的问题,试图用稍微不同的设置来配置项目的自动重载。我设置了卷,但是仍然无法正常工作。经过一个小时的谷歌搜索和彻底检查我的代码后,我发现Dockerfile和docker-compose.yml中的路径完全不匹配。确保它们相同。
我的Dockerfile
FROM python:3.6.9-alpine3.10
COPY ./requirements/local.txt /app/requirements/local.txt
RUN set -ex \
&& apk add --no-cache --virtual .build-deps postgresql-dev git gcc libgcc musl-dev jpeg-dev zlib-dev build-base \
&& python -m venv /env \
&& /env/bin/pip install --upgrade pip \
&& /env/bin/pip install --no-cache-dir -r /app/requirements/local.txt \
&& runDeps="$(scanelf --needed --nobanner --recursive /env \
| awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
| sort -u \
| xargs -r apk info --installed \
| sort -u)" \
&& apk add --virtual rundeps $runDeps \
&& apk del .build-deps
### Here is the path to the project
COPY . /app
WORKDIR /app/project
ENV VIRTUAL_ENV /env
ENV PATH /env/bin:$PATH
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
EXPOSE 8088
我的docker-compose.yml
version: '3'
services:
web:
build:
context: ../..
dockerfile: compose/local/Dockerfile
restart: on-failure
command: python manage.py runserver 0.0.0.0:8088 --settings=project.settings.local
volumes:
# - .:/var/www/app # messed up path
- .:/app # correct path
env_file:
- ../../.env.local
depends_on:
- db
ports:
- "8000:8000"