каков конечный выходной образ в многоступенчатой сборке?

#docker

#docker

Вопрос:

Ниже приведен файл dockerfile, который создает образ:

 FROM diamol/base AS build-stage                  
RUN echo 'Building...' > /build.txt             

FROM diamol/base AS test-stage
COPY --from=build-stage /build.txt /build.txt
RUN echo 'Testing...' >> /build.txt              

FROM diamol/base
COPY --from=test-stage /build.txt /build.txt
RUN echo 'Done...' >> /build.txt               
  

и, насколько я понимаю, конечное изображение состоит из слоев diamol / base и слоя, созданного после последней команды ЗАПУСКА, как показано на рисунке ниже:
введите описание изображения здесь

Правильно ли я понимаю?

Комментарии:

1. Умножение опубликовано на devops.stackexchange.com/q/12268/23883 .

Ответ №1:

Схема верна, поскольку каждый шаг в многоступенчатой сборке выполняется поверх diamol/base . На каждом шаге build.txt файл копируется и изменяется. Вы можете проверить содержимое файла, запустив контейнер из конечного изображения (например foo ):

 $ docker build -t foo .
$ docker run --rm -it --entrypoint=cat foo build.txt
Building...
Testing...
Done...
  

Ответ №2:

RUN COPY , ADD создайте слои, так что технически у вас есть 3 слоя:

  • начальный diamol/base слой
  • один слой сверху, содержащий скопированное build.txt
  • и последний слой, в котором вы добавляете done в текстовый файл.

Вы можете самостоятельно просмотреть изображение, чтобы проверить слои, созданные в процессе сборки:

 docker inspect <image-ID> --format '{{json .RootFS.Layers}}' | python -m json.tool
  

Два промежуточных этапа создают свои собственные изображения, которые вы можете видеть в docker image ls без имени и тега <none>:<none>