Как упоминалось в комментариях, многоэтапная сборка включает в себя один 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, без необходимости переделывать ваш рабочий процесс.