Как правильно использовать dotnet restore в Dockerfile - PullRequest
0 голосов
/ 24 ноября 2018

При добавлении поддержки докеров в проект ASP.NET Core VS (15.9.2) добавит Dockerfile по умолчанию, который восстанавливает, создает и публикует.Но вместо того, чтобы просто копировать все файлы в сборочный контейнер Docker, он сначала копирует только proj-файлы, выполняет восстановление, а затем копирует остальные файлы перед сборкой.Мне было интересно, почему это делается так?Чем это отличается от простого копирования всех файлов напрямую и последующего восстановления?

Проблема этого подхода заключается в том, что все proj-файлы в решении необходимо будет копировать отдельно, и если проект действительнобольшой с проектами, добавляемыми и удаляемыми время от времени, довольно трудно поддерживать синхронизацию Dockerfile с этим.Я просто хотел бы знать, почему это делается так, и если это будет так же хорошо, чтобы скопировать все вместо этого?

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY ["Temp2/Temp2.csproj", "Temp2/"]
COPY ["Temp3/Temp3.csproj", "Temp3/"]
RUN dotnet restore "Temp2/Temp2.csproj"
COPY . .
WORKDIR "/src/Temp2"
RUN dotnet build "Temp2.csproj" -c Release -o /app

или

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY . .
RUN dotnet restore "Temp2/Temp2.csproj"
WORKDIR "/src/Temp2"
RUN dotnet build "Temp2.csproj" -c Release -o /app

1 Ответ

0 голосов
/ 22 февраля 2019

Когда Docker создает образ, он поддерживает кэш сборки :

При создании изображения Docker выполняет инструкции в вашем файле Docker, выполняя каждое из них в указанном порядке,При рассмотрении каждой инструкции Docker ищет существующий образ в своем кэше, который он может использовать повторно, вместо создания нового (дублирующего) образа.

Важно, что инструкции ADD и COPYполучить специальную обработку:

Для инструкций ADD и COPY проверяется содержимое файла (ов) в изображении и для каждого файла вычисляется контрольная сумма.Время последнего изменения и последнего доступа к файлам не учитывается в этих контрольных суммах.Во время поиска в кэше контрольная сумма сравнивается с контрольной суммой в существующих изображениях.Если в файле (файлах) что-либо изменилось, например, содержимое и метаданные, кэш-память становится недействительной.

При создании решения .NET Core мы можем быть уверены, что после запуска dotnet restore, результат повторного запуска dotnet restore изменится только в случае изменения файла .csproj (например, добавлен новый пакет или изменена версия).

Путем копирования файлов .csproj вimage отдельно , мы можем воспользоваться кешем сборки Docker, что означает, что до тех пор, пока файл .csproj не изменился, шаг dotnet restore не будет повторяться без необходимости каждый разизображение восстанавливается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...