Чтобы сделать его более эффективным, сначала необходимо скопировать все файлы .csproj
проекта, а затем восстановить их для кэширования результатов. Затем скопируйте все остальное и опубликуйте проект. Таким образом, ваш Dockerfile будет выглядеть примерно так:
FROM microsoft/dotnet:sdk AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY aspnetapp/aspnetapp.csproj aspnetapp/
COPY TestData/TestData.csproj TestData/
COPY TestLogic/TestLogic.csproj TestLogic/
COPY TestData2/TestData2.csproj TestData2/
RUN dotnet restore ./aspnetapp/aspnetapp.csproj
# Copy everything else and build
COPY . ./
RUN dotnet publish ./aspnetapp -c Release -o out
# Build runtime image
FROM microsoft/dotnet:aspnetcore-runtime
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "aspnetapp.dll"]
Возможно, вы захотите явно копировать проекты после восстановления, если у вас есть больше проектов в решении, чтобы сократить время сборки контейнера.
В моем проекте я создал инструмент, который создает директивы COPY
для основных зависимостей проекта из командной строки, чтобы упростить процесс.