#.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/"]
того, чтобы сказать тебе большое спасибо, это отлично работает.