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

时间:2015-08-15 05:53:58

标签: django docker gunicorn docker-compose

我正在使用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 restartdocker-compose up),但代码不会刷新。

我错过了什么?

2 个答案:

答案 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"