многоэтапную сборку в докере сочинять? - PullRequest
0 голосов
/ 01 ноября 2018

Как мне указать многоступенчатую сборку в docker-compose.yml?

Для каждого варианта (например, dev, prod ...) у меня есть многоэтапная сборка с 2 файлами докеров:

  • dev: Dockerfile.base + Dockerfile.dev
  • или продукт: Dockerfile.base + Dockerfile.prod

Файл Dockerfile.base (общий для всех вариантов):

FROM python:3.6
RUN apt-get update && apt-get upgrade -y
RUN pip install pipenv pip
COPY Pipfile ./
# some more common configuration...

Файл Dockerfile.dev:

FROM flaskapp:base
RUN pipenv install --system --skip-lock --dev
ENV FLASK_ENV development
ENV FLASK_DEBUG 1

Файл Dockerfile.prod:

FROM flaskapp:base
RUN pipenv install --system --skip-lock
ENV FLASK_ENV production

Без docker-compose я могу построить как:

# Building dev
docker build --tag flaskapp:base -f Dockerfile.base .
docker build --tag flaskapp:dev -f Dockerfile.dev .
# or building prod
docker build --tag flaskapp:base -f Dockerfile.base .
docker build --tag flaskapp:dev -f Dockerfile.dev .

Согласно документу compose-file , я могу указать Dockerfile для сборки.

# docker-compose.yml
version: '3'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile-alternate

Но как я могу указать 2 файла Docker в docker-compose.yml (для многоэтапной сборки)?

1 Ответ

0 голосов
/ 01 ноября 2018

Как упоминалось в комментариях, многоэтапная сборка включает в себя один Dockerfile для выполнения нескольких этапов. То, что у вас есть, это общая базовая картинка.

Вы можете преобразовать их в нетрадиционную многоэтапную сборку с синтаксисом вроде (я говорю нетрадиционно, потому что вы не выполняете никакого копирования между слоями, а вместо этого используете только строку from для выбора на предыдущем этапе) :

FROM python:3.6 as base
RUN apt-get update && apt-get upgrade -y
RUN pip install pipenv pip
COPY Pipfile ./
# some more common configuration...

FROM base as dev
RUN pipenv install --system --skip-lock --dev
ENV FLASK_ENV development
ENV FLASK_DEBUG 1

FROM base as prod
RUN pipenv install --system --skip-lock
ENV FLASK_ENV production

Затем вы можете построить ту или иную сцену, используя синтаксис --target для компоновки, или создать файл наподобие:

# docker-compose.yml
version: '3.4'
services:
  webapp:
    build:
      context: ./dir
      dockerfile: Dockerfile
      target: prod

Самым большим недостатком является то, что текущий движок сборки будет проходить через каждую стадию, пока не достигнет цели. Кэширование сборки может означать, что это всего лишь подсекундный процесс. А BuildKit, который выйдет из эксперимента в 18.09 и будет нуждаться в поддержке upstream от docker-compose, будет более умным в том, что касается запуска только необходимых команд для создания желаемой цели.

Все это говорит о том, что я пытаюсь втиснуть квадратный колышек в круглое отверстие. Разработчик docker-compose рекомендует пользователям отказаться от сборки в самом файле compose, поскольку он не поддерживается в режиме роя. Вместо этого рекомендуемое решение состоит в том, чтобы выполнять сборки с сервером сборки CI / CD и помещать эти образы в реестр. Затем вы можете запустить тот же самый файл компоновки с docker-compose или docker stack deploy или даже с некоторыми эквивалентами k8s, без необходимости переделывать ваш рабочий процесс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...