Dockerfile не выполняет второй этап

У меня какое-то странное поведение от Docker, и я нигде не могу найти упоминания об этом. Кажется, что этапы пропускаются случайным образом, даже с многоэтапными файлами Dockerfile, которые я просто скопировал и вставил с форумов в сети.

Мой докерфайл:

FROM alpine as base
RUN echo "1"

# SKIPPED
FROM base as mid
RUN echo "2"

FROM base as final
RUN echo "3"

ВЫХОД:

docker build -t test .\ --no-cache
[+] Building 2.0s (7/7) FINISHED
 => [internal] load .dockerignore                                                                                  0.0s
 => => transferring context: 34B                                                                                   0.0s
 => [internal] load build definition from Dockerfile                                                               0.0s
 => => transferring dockerfile: 143B                                                                               0.0s
 => [internal] load metadata for docker.io/library/alpine:latest                                                   1.3s
 => CACHED [base 1/2] FROM docker.io/library/alpine@sha256:...  0.0s
 => [base 2/2] RUN echo "1"                                                                                        0.3s
 => [final 1/1] RUN echo "3"                                                                                       0.4s
 => exporting to image                                                                                             0.0s
 => => exporting layers                                                                                            0.0s
 => => writing image sha256:...                      0.0s
 => => naming to docker.io/library/...                                                                 0.0s

Что вызывает это?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
9
0
1 864
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Buildkit использует граф зависимостей. Он смотрит на целевой этап, который по умолчанию является последним:

FROM base as final
RUN echo "3"

Отсюда он видит, что base необходим для построения этого этапа, поэтому он извлекает базовый этап:

FROM alpine as base
RUN echo "1"

И после этого все готово, нет необходимости создавать промежуточную стадию для создания целевого образа. В FROM или COPY --from нет зависимостей, которые потребовали бы этого. Это поведение отличается от классической сборки Docker, которая выполняла шаги по порядку, пока не была достигнута целевая стадия, и является одной из причин, по которой buildkit работает намного быстрее.

Ах я вижу. Из любопытства, есть ли способ заставить его пройти все этапы?

Eduard G 10.12.2020 15:41

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

BMitch 10.12.2020 15:45

Для меня установка переменной среды DOCKER_BUILDKIT на 0 позволила выполнить все шаги. Конечно, вы теряете преимущества buildkit, так что вам придется это взвесить.

Lewis Marhin 23.02.2021 23:39

Другие вопросы по теме