【问题标题】:How can I reload python code in dockerized django?如何在 dockerized django 中重新加载 python 代码?
【发布时间】:2019-08-19 04:26:29
【问题描述】:

我正在使用 docker-compose 运行 3 个容器: django + gunicornnginxpostgresQL

每次我更改我的 python .py 代码时,我都会运行 docker-compose restart web 但需要很长时间才能重新启动。 我尝试用

重新启动 gunicorn
`docker-compose exec web ps aux |grep gunicorn | awk '{ print $2 }' |xargs kill -HUP`

但是没有用。

如何在更短的时间内重新加载.py 代码?

我知道 gunicorn 可以设置为热重载 python 代码。我可以通过命令手动完成吗?

我的 docker-compose.yml:

version: '3'

services:
  db:
    build: ./db/
    volumes:
      - dbdata:/var/lib/postgresql/data/
    environment:
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
  web:
    build: .
    command: >
      sh -c "gunicorn abc.wsgi -b 0.0.0.0:8000"
    # sh -c "python manage.py collectstatic --noinput &&
    #        python manage.py loaddata app/fixtures/masterData.json &&
    #        gunicorn abc.wsgi -b 0.0.0.0:8000"
    volumes:
      - .:/var/www/django
      - ./static:/static/
    expose:
      - "8000"
    environment:
      - USE_S3
      - AWS_ACCESS_KEY_ID
      - AWS_SECRET_ACCESS_KEY
      - AWS_STORAGE_BUCKET_NAME
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - POSTGRES_HOST
      - SENDGRID_API_KEY
      - SECRET_KEY
    depends_on:
      - db
  nginx:
    restart: always
    build: ./nginx/
    volumes:
      - ./static:/static/
    ports:
      - "8000:80"
    links:
      - web
  backup:
    image: prodrigestivill/postgres-backup-local:11-alpine
    restart: always
    volumes:
      - /var/opt/pgbackups:/backups
    links:
      - db
    depends_on:
      - db
    environment:
      - POSTGRES_HOST
      - POSTGRES_DB
      - POSTGRES_USER
      - POSTGRES_PASSWORD
      - SCHEDULE
      - BACKUP_KEEP_DAYS
      - BACKUP_KEEP_WEEKS
      - BACKUP_KEEP_MONTHS
      - HEALTHCHECK_PORT

volumes:
  dbdata:

Dockerfile - 网络:

FROM python:3.7-slim
ENV PYTHONUNBUFFERED 1
ENV WKHTML2PDF_VERSION 0.12.4
# 0.12.5 wget not work
ENV TERM linux
ENV DEBIAN_FRONTEND noninteractive
RUN mkdir /var/www
RUN mkdir /var/www/django
WORKDIR /var/www/django
ADD requirements.txt /var/www/django/
RUN apt-get update && apt-get install -y \
    libpq-dev \
    python-dev \
    gcc \
    openssl \
    build-essential \
    xorg \
    libssl1.0-dev \
    wget
RUN apt-get install -y sudo
RUN pip install --upgrade pip
RUN pip install -r requirements.txt && pip3 install requests && pip3 install pdfkit
# & pip3 install sendgrid-django
ADD . /var/www/django/
WORKDIR /var/www
RUN wget "https://github.com/wkhtmltopdf/wkhtmltopdf/releases/download/${WKHTML2PDF_VERSION}/wkhtmltox-${WKHTML2PDF_VERSION}_linux-generic-amd64.tar.xz"
RUN tar -xJf "wkhtmltox-${WKHTML2PDF_VERSION}_linux-generic-amd64.tar.xz"
WORKDIR wkhtmltox
RUN sudo chown root:root bin/wkhtmltopdf
RUN sudo cp -r * /usr/
WORKDIR /var/www/django

Dockerfile - nginx:

FROM nginx

# Copy configuration files to the container
COPY default.conf /etc/nginx/conf.d/default.conf

【问题讨论】:

  • 您的应用需要多长时间才能启动?您是否有理由不想让 gunicorn 处理重新加载?
  • 如果您使用 docker 进行本地开发,那么最好使用./manage.py runserver 而不是 gunicorn。
  • 你能分享你的 docker-compose.yml 和 Dockerfile(如果有的话)吗?
  • 首先,可以重启容器。如果不行,运行docker exec -tiu container_name,在容器中重启gunicorn。
  • @IainShelvington 可能需要一分钟。当我在没有 docker 的情况下进行开发时,我只需重新启动 gunicorn / nginx 即可在几秒钟内重新加载代码。如果 gunicorn 处理自动重新加载,恐怕我的开发服务器会经常宕机。

标签: python django docker-compose gunicorn


【解决方案1】:

过了一会儿,我发现这条线有问题: gunicorn abc.wsgi -b 0.0.0.0:8000

这一行将使 gunicorn 运行一个子进程。当我尝试向 gunicorn 提交 HUP 信号时,只有主进程才能接收到信号。所以gunicorn没有被杀死。无法重新加载代码。

我所做的是在它之前添加“exec”,Gunicorn 将作为主进程运行。我可以使用“docker-compose kill -s HUP web”优雅地重启gunicorn,我的代码将被重新加载到容器中

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-07
    • 2018-11-06
    • 2011-12-16
    • 2011-04-22
    • 2016-09-03
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    相关资源
    最近更新 更多