Сделав эти два шага - скопируйте проект, восстановите, скопируйте код, это означает, что ваш промежуточный шаг «восстановление dotnet» будет кэшироваться Docker, и все будет ПУТЬ быстрее.

ументы Visual Studio для Docker создают Dockerfile для проектов ASP.NET, содержащихCOPY . . команда как ниже:

WORKDIR /src
COPY *.sln ./
...
COPY . .

Из того, что я прочитал,<src> Параметр относится к контексту, поэтому не зависит отWORKDIR /src команда.<dest> Однако относительноWORKDIR так будет указывать на/src.

Эта команда просто переносит оставшиеся файлы из корня для упаковки (docker-compose.yml, .dockerignore и т. Д.)? Если так, то почему это делается раньшеRUN dotnet build... команда?

Полный Dockerfile ниже:

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/aspnetcore-build:2.0 AS build
WORKDIR /src
COPY *.sln ./
COPY MyProject/MyProject.csproj MyProject/
RUN dotnet restore
COPY . . # The line mentioned above
WORKDIR /src/MyProject
RUN dotnet build -c Release -o /app

FROM build AS publish
RUN dotnet publish -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "MyProject.dll"]

Ответы на вопрос(2)

https://www.hanselman.com/blog/OptimizingASPNETCoreDockerImageSizes.aspx

СОВЕТ ПРОФЕССИОНАЛА: Docker умеет создавать промежуточные изображения и выполнять наименьшую работу, но это полезно, если мы (авторы) также делаем правильные вещи, чтобы помочь ему.

Например, посмотрите, где мы копируем файл .csproj, а затем делаем «восстановление dotnet»? Часто вы увидите, как люди делают «КОПИЯ». а затем сделать восстановление. Это не позволяет Docker обнаруживать, что изменилось, и вы в конечном итоге заплатите за восстановление в КАЖДОМ СТРОЙ.

Сделав эти два шага - скопируйте проект, восстановите, скопируйте код, это означает, что ваш промежуточный шаг «восстановление dotnet» будет кэшироваться Docker, и все будет ПУТЬ быстрее.

Решение Вопроса

COPY . . копирует весь проект, рекурсивно в контейнер для сборки.

Причина разделения первых экземпляров плюсrestore а затем полная копия плюсbuild это трюк с кешированием для ускорения сборки, поэтому нет необходимости устанавливать зависимости проекта при каждом изменении кода.

Изображения Docker встроены в слои, Docker сравнивает содержимое и инструкции, которые будут составлять каждый новый слой с предыдущими сборками. Если они соответствуют контрольной сумме SHA256 для существующего слоя, этап построения для этого слоя можно пропустить.

Код меняется намного больше, чем зависимости, и зависимости теперь обычно выбираются из медленной (ish) сети. Если вы скопируете код после того, как зависимости будут завершены, вы не перестанете кэшировать слой зависимостей для всех остальных изменений.

Эквивалент Node.js делаетpackage.json перед содержанием приложения:

WORKDIR /app
COPY package.json /app/
RUN npm install
COPY . /app/
CMD ["node", "app/index.js"]
 Simon_Weaver26 авг. 2018 г., 03:15
Помогло бы, если бы сгенерированные файлы докеров из visual studio содержали комментарии! Поначалу это очень запутанно, и все учебные пособия просто отбрасывают это и ожидают, что вы все поймете. Дело в том, чтоCOPY . . пропускает файлы, уже есть то, что важно.

Ваш ответ на вопрос