Несколько запросов относительно Docker Multi Stage Build процесса - PullRequest
0 голосов
/ 17 марта 2020

Я новичок в Docker и запутался в нескольких вещах. У меня также есть несколько запросов. Пожалуйста, найдите их ниже. Я был бы рад, если бы эти запросы были решены.

Вопрос 1: В многоступенчатых сборках, как docker идентифицирует артефакты стадии? Поскольку я видел во многих статьях, люди говорят, что COPY --from=0 src dest скопирует артефакты с последней стадии сборки. Я имею в виду, где мы явно определили, что вам нужно скопировать артефакты из этой папки? Что определяет build output / build artifact сцены?

# Stage 1
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /build
COPY . .
RUN dotnet restore
RUN dotnet publish -c Release -o /app

# Stage 2
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS final
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet", "Core3Api.dll"]
  • Q2 - Копирует ли COPY --from=build src dest файлы из предыдущей сборки или изображения?
  • Q3 - Обычно копирование имеет два параметра: один является источником, а другой - местом назначения. Выше у нас есть три параметра, --from=build src dest. Как работает эта копия?
  • Q4 - Нужно ли устанавливать WORKDIR на каждом этапе сборки? Потому что я думаю, что каждый этап сборки выполняется в новом изолированном контексте? ИЛИ он использует тот же контекст?
  • Q5 - Где Docker хранит образ предыдущей сборки при переходе на следующий этап?

Все мои вопросы взаимосвязаны, поэтому я объединил всех в одну.

1 Ответ

1 голос
/ 17 марта 2020

Docker сборок изображений ; каждое изображение состоит из файловой системы плюс некоторые дополнительные метаданные. В контексте многоступенчатой ​​сборки (Q5) каждая строка FROM начинает новую сборку изображения, и результатом этих сборок изображения являются полностью нормальные изображения; вы можете увидеть их (возможно, с именем <none>) в выводе docker images. Точно так же, поскольку каждый этап сборки помечается FROM контекстом некоторого предыдущего изображения, (Q4) вам нужно повторять WORKDIR на каждом этапе, где это имеет значение (но поскольку каждый этап находится в изолированном контексте сборки, разные этапы не t обязательно нужен тот же рабочий каталог).

Команда Dockerfile COPY (Q3) может принимать параметры во многом так же, как вы можете cp -r from to в обычной оболочке. Опция --from (Q2) называет изображение; это может быть более ранняя стадия сборки FROM ... AS name в том же Dockerfile или произвольное другое изображение. (Q1) Он копирует из любой файловой системы результат построения образа.

FROM ... AS build
WORKDIR /build
RUN ...
COPY ...
# An image is created that's effectively a snapshot here

FROM ...
WORKDIR /app
COPY src dest                       # from the build context
COPY --from=build /build/dir dest2  # from the "snapshot" point
COPY --from=0 /build/dir dest3      # from the first image in this Dockerfile
COPY --from=busybox:latest /bin/busybox dest4  # from another image
...