Сборка Docker выполняет инструкции под другим целевым объектом (многоступенчатая)

#docker #dockerfile #docker-multi-stage-build

Вопрос:

У меня есть фиктивный файл Dockerfile:

 FROM python:3.8-alpine3.13 AS python-base

RUN echo http://mirror.yandex.ru/mirrors/alpine/v3.13/main > /etc/apk/repositories; 
    echo http://mirror.yandex.ru/mirrors/alpine/v3.13/community >> /etc/apk/repositories

ENV PYTHONDONTWRITEBYTECODE=1 
    PYTHONFAULTHANDLER=1 
    PYTHONUNBUFFERED=1 
    PYTHONHASHSEED=random

FROM python-base as builder-base

WORKDIR /app
RUN apk update amp;amp; apk add --no-cache 
    gcc musl-dev postgresql-dev openldap-dev gettext-dev 
    libffi-dev openssl-dev python3-dev jpeg-dev zlib-dev musl-locales 
    musl-locales-lang postgresql-libs libjpeg graphviz-dev ttf-freefont
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
COPY pythonapline .
RUN python manage.py migrate
RUN python manage.py compilemessages
EXPOSE 8000

CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]

FROM builder-base as development
RUN pip install fastapi
RUN echo 'DEVELOPMENT'

FROM builder-base as test
RUN echo 'TEST'
 

Когда я хочу создать изображение под целью test Я выполняю команду:

 docker build -t myimage --target=test .
 

Но я заметил, что инструкции в рамках целевой разработки также выполняются:

 ....
Step 16/18 : RUN echo 'DEVELOPMENT'
 ---> Running in 4cfa2ed80350
DEVELOPMENT
Removing intermediate container 4cfa2ed80350
 ---> 935d770dfe6d
Step 17/18 : FROM builder-base AS test
 ---> 442c02445aae
Step 18/18 : RUN echo 'TEST'
 ---> Running in 13432a53bec0
TEST
Removing intermediate container 13432a53bec0
 ---> 96e80f6d9603
Successfully built 96e80f6d9603
 

Это ожидаемо? Если нет, то что происходит?

Ответ №1:

--target Опция не означает «начать с этой цели» или «только построить эту цель»; это означает «остановиться на этой цели«.

Поэтому , если вы укажете --target test , Docker запустит test этап и все этапы, которые ему предшествуют.