Назад | Перейти на главную страницу

Совместное использование базы кода между контейнерами докеров

У меня есть два контейнера. Один используется для хранения моего приложения django с запущенным Gunicorn, а другой - для очереди задач сельдерея.

Celery использует ту же базу кода приложения django.

Когда я создаю контейнер докеров Django, я использую ADD . /usr/src/app оператор для копирования исходных файлов в контейнер. Но Dockerfile для Celery лежит в другой папке, поэтому нет возможности копировать в нее файлы, поскольку они находятся вне контекста.

Пока я вижу две возможности:

Сейчас я использую третье решение. Есть ли способы лучше? Использовать git clone в dockerfile? Но как авторизоваться тогда ...

В нашем текущем приложении-докере у нас есть три разных образа, которые используются для двух контейнеров.

  • Основание - Это то, что содержит общие зависимости (заголовки разработки), а также исходный код Python.
  • Интернет - Устанавливаются специфичные для Интернета зависимости, такие как Gunicorn. Он также настраивает CMD и порты.
  • Рабочий - Это устанавливает зависимости, зависящие от работника, в основном настраивая пользователя Celery и блокируя его.

Базовое изображение находится в корне нашего репозитория, а наше базовое изображение эквивалентно 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