Докеризация .net — приложения с вложенным файлом решения

#.net #docker #.net-core

#.net #докер #.net-ядро

Вопрос:

Я хочу закрепить решение для нескольких проектов с вложенным файлом решения. Это то, что я пытался сделать:

Структура папок:

 -Project1 --project1.csproj -Project2 --project2.csproj -ProjectApi --DockerFile --projectApi.sln --projectApi.csproj  

Мой док-файл:

 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80  FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["ProjectApi.csproj", "."] COPY ["../Project1/Project1.csproj", "../Project1/"] COPY ["../Project2/Project2.csproj", "../Project2/"] RUN dotnet restore "./ProjectApi.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "ProjectApi.csproj" -c Release -o /app/build  FROM build AS publish RUN dotnet publish "ProjectApi.csproj" -c Release -o /app/publish  FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "ProjectApi.dll"]  

Моя конфигурация Дженкинса:

 docker rmi $(docker images -q) || true sh stop_containers.sh || true  docker build --no-cache -t project_server_api -f ./project_Api/Dockerfile . docker run -d --log-opt max-size=5m --log-opt max-file=3 --name projectApi cd ..  

Ошибка, которую я получаю:

 COPY failed: stat /var/lib/docker/tmp/docker-builder193332682/ProjectApi.csproj: no such file or directory  

Я пробовал использовать разные пути или файл dockerfile в верхней папке, но у меня есть: Forbidden path outside the build context Что я должен изменить?

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

1. вы пропустили копирование файла sln

Ответ №1:

Вы не можете переместить каталог вверх, как вы это делаете с исходным файлом COPY ["../Project1/Project1.csproj", "../Project1/"] .

Это выводит вас за рамки контекста сборки, и это запрещено по соображениям безопасности.

Вам нужно переместить файл Dockerfile в каталог и настроить пути в файле Dockerfile. Таким образом, все файлы, которые вы хотите скопировать, находятся в том же каталоге, что и файл Dockerfile, или в каталогах ниже этого.

Вот мое предположение о том, как должен выглядеть ваш файл Dockerfile в зависимости от вашей структуры каталогов

 FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80  FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY ["ProjectApi/ProjectApi.csproj", "ProjectApi/"] COPY ["Project1/Project1.csproj", "Project1/"] COPY ["Project2/Project2.csproj", "Project2/"] RUN dotnet restore "ProjectApi/ProjectApi.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "ProjectApi/ProjectApi.csproj" -c Release -o /app/build  FROM build AS publish RUN dotnet publish "ProjectApi/ProjectApi.csproj" -c Release -o /app/publish  FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "ProjectApi.dll"]  

Для простоты неплохо иметь файл Dockerfile в каталоге, который также является контекстом сборки, поэтому вы можете рассмотреть возможность перемещения файла Dockerfile в один каталог.

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

1. Кроме того, необходимо поместить файл docker в то же место, что и файл sln

2. @samnaction Файл решения ни для чего не используется в этом файле Dockerfile, так как OP создает файл csproj.

3. Разве это -f ./project_Api/Dockerfile . не открывает вложенную папку dockerfiled, но оставляет контекст в верхней папке?

4. @Gohini Да, в этом случае контекст вашей сборки-это текущий каталог. Таким образом, ваши заявления о КОПИРОВАНИИ должны выглядеть примерно так COPY ["Project1/Project1.csproj", "Project1/"] .

5. Ладно, я совершил глупую ошибку, я ушел COPY ["ProjectApi/ProjectApi.csproj", "."] вместо COPY ["ProjectApi/ProjectApi.csproj", "ProjectApi/"] того, чтобы сказать тебе большое спасибо, это отлично работает.