Автоматическая перезагрузка изменений кода с развитием 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. Затем обновление: если нажать код для удаления хоста docker, я нахожу гораздо проще просто перестроить контейнер docker (например,--reload
флаг будет автоматически перезагружать gunicorn после любого scp / rsync.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, если ваш файл требований изменится!