2015-08-15 7 views
26

Я использую контейнер Docker для разработки Django, а контейнер запускает Gunicorn с Nginx. Я бы хотел, чтобы изменения кода были загружены автоматически, но единственный способ заставить их загрузить - восстановить с помощью docker-compose (docker-compose build). Проблема с «сборкой» заключается в том, что она повторно запускает все мои установки папок.Автоматическая перезагрузка изменений кода с помощью разработки Django в Docker с Gunicorn

Я использую флаг 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

У вас есть общий объем с кодом? Можете ли вы опубликовать часть своего файла docker-compose.yml для просмотра сценария? – kikicarbonell

+0

Я не понимаю вашу проблему. «Проблема с« сборкой »заключается в том, что она перезапускает все мои установки папок». Возможно, вы можете сделать сначала все установки pip, так что 'docker build' загружает только изменения кода. Можете ли вы показать свой файл Docker? У вас также может быть файл Docker, начинающийся с 'FROM mypipinstalls' – user2915097

+0

kikicarbonell, ваш вопрос помог мне понять, что мне нужен объем для моего кода, и, похоже, исправлена ​​моя проблема, поэтому спасибо, что привели меня к решению! –

ответ

21

Благодаря kikicarbonell, я изучил объем для моего кода, и, посмотрев на Docker Compose recommended Django setup, я добавил 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 

Update: для тщательного примера использования Gunicorn и Django с Докер, проверка этого example project from Rackspace, который также показывает, как использовать Докер-машину, чтобы запустить установку на удаленных серверах, таких как Rackspace Cloud.

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

+0

Я думал, что inotify не работает с тонами Докера. https://github.com/docker/docker/issues/18246 Любая идея, почему это работает? –

+1

@EricIhli - этот метод не работает, когда хост докера удален (поскольку декларации томов в файле Compose относятся к хосту докера). Я обновил свой ответ с разъяснением этого. –

+1

Ах. Благодарю. Я решил решить проблему изменения файлов и выполнить некоторые действия внутри контейнера, используя «fswatch» на Mac, перейдя к «xargs» и выполнив «docker exec », если кто-то еще ищет что. –

14

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

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/ 

Это приведет к аннулированию вашей установочной линии, если ваш файл требований изменится!

+0

Мне было интересно, почему ADD был избыточным. Спасибо, что дали мне знать –