У меня есть два контейнера. Один используется для хранения моего приложения django с запущенным Gunicorn, а другой - для очереди задач сельдерея.
Celery использует ту же базу кода приложения django.
Когда я создаю контейнер докеров Django, я использую ADD . /usr/src/app
оператор для копирования исходных файлов в контейнер. Но Dockerfile для Celery лежит в другой папке, поэтому нет возможности копировать в нее файлы, поскольку они находятся вне контекста.
Пока я вижу две возможности:
mount -o bind
кажется взломаннымvolumes-from
.Сейчас я использую третье решение. Есть ли способы лучше? Использовать git clone
в dockerfile? Но как авторизоваться тогда ...
В нашем текущем приложении-докере у нас есть три разных образа, которые используются для двух контейнеров.
CMD
и порты.Базовое изображение находится в корне нашего репозитория, а наше базовое изображение эквивалентно ADD . /usr/src/app
вместе с некоторыми другими вещами. И веб-образы, и рабочие изображения исходят из этого базового образа, поэтому оба они также имеют исходный код.
Это позволяет вам совместно использовать код между обоими контейнерами и не требует наличия другого тома, содержащего код.
Пример настройки трех файлов Dockerfile:
./Dockerfile
FROM python:3.4
ADD . /usr/src/app
RUN pip install -r /usr/src/app/requirements.txt
./web/Dockerfile
FROM app-base:latest
RUN pip install gunicorn
./worker/Dockerfile
FROM app-base:latest
RUN pip install celery
Который затем нужно будет построить как
docker build -t app-base .
docker build -t app-web web
docker build -t app-worker worker
Это не сработает с докер сочинять потому что он не поддерживает наследование изображений.
Мой первоначальный ответ по-прежнему служит верным решением проблемы, но теперь существует другое решение, начиная с версии Docker 1.6.0. Теперь вы можете указать расположение Dockerfile
, и он не обязательно должен находиться в том же каталоге, что и корень контекста сборки.
./Dockerfile.web
FROM python:3.4
ADD . /usr/src/app
RUN pip install gunicorn
./Dockerfile.worker
FROM python:3.4
ADD . /usr/src/app
RUN pip install celery
Рекомендуется сохранить ADD
линии в верхней части вашего Dockerfile
, поэтому добавление должно произойти только один раз, и его можно повторно использовать для создания как веб-изображений, так и рабочих изображений.
Вы можете создавать изображения как
docker build -t app-web -f Dockerfile.web .
docker build -t app-worker -f Dockerfile.worker .
Или используя Docker Compose, конфигурация будет выглядеть как
services:
web:
build:
context: .
dockerfile: Dockerfile.web
worker:
build:
context: .
dockerfile: Dockerfile.worker