Автоматическая перезагрузка изменений кода с развитием Django в Docker с Gunicorn

я использую контейнер Docker для разработки Django, и контейнер запускает Gunicorn с Nginx. Я бы хотел, чтобы изменения кода автоматически загружались, но единственный способ заставить их загружаться-это перестроение с помощью 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-compose restart, docker-compose up), но код не обновить.

что я упустил?

2 ответов


благодаря kikicarbonell, я заглянул в том для моего кода, и после просмотра Docker Compose рекомендуемая настройка Django, я добавил volumes: - .:/code в мой веб-контейнер в docker-compose.yml, и теперь любые изменения кода, которые я делаю, автоматически применяются.

## 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

обновление: для тщательного примера использования Gunicorn и Django с Docker, проверьте это пример проекта из Rackspace, который также показывает, как использовать docker-machine для запустите установку на удаленных серверах, таких как Rackspace Cloud.

предостережение: в настоящее время этот метод не работает, когда ваш код локально, а хост docker удален (например, на облачном провайдере, таком как Digital Ocean или Rackspace). Это также относится к виртуальным машинам, если локальная файловая система не установлена на виртуальной машине. Обратите внимание, что существуют отдельные драйверы томов (например, flocker), и там может быть чем-то там, чтобы решить эту проблему. для теперь "исправление" - это rsync/scp ваши файлы до каталога на удаленном хосте docker. Затем --reload флаг будет автоматически перезагружать gunicorn после любого scp / rsync. обновление: если нажать код для удаления хоста docker, я нахожу гораздо проще просто перестроить контейнер docker (например,docker-compose build web && docker-compose up -d). Это может быть медленнее, чем подход rsync, если ваша папка src большая.


у вас есть еще одна проблема-Docker кэширует каждый слой, который он строит. Вы не должны повторно запускать pip install каждый раз!

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

Это ваша проблема-Docker проверяет каждый оператор ADD, чтобы увидеть, если какие-либо файлы изменились и аннулирует кэш для него и каждый последующий шаг, если он имеет. Правильный способ сделать это...

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

что только аннулирует вашу строку установки pip, если ваш файл требований изменится!