【问题标题】:Dockerize .net app with nested solution file使用嵌套解决方案文件 Dockerize .net 应用程序
【发布时间】:2022-01-12 11:02:08
【问题描述】:

我想用嵌套的解决方案文件对多项目解决方案进行 dockerize。这是我试图做的:

文件夹结构:

-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 我应该改变什么?

【问题讨论】:

  • 你错过了复制 sln 文件

标签: .net docker .net-core


【解决方案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 上移一个目录。

【讨论】:

  • 另外,需要把docker文件和sln文件放到同一个位置
  • @samnaction 解决方案文件不用于此 Dockerfile 中的任何内容,因为 OP 构建 csproj 文件。
  • -f ./project_Api/Dockerfile . 是否打开嵌套的 dockerfiled 但将上下文留在上层文件夹中?
  • @Gohini 是的,在这种情况下,您的构建上下文是当前目录。所以你的 COPY 语句应该类似于COPY ["Project1/Project1.csproj", "Project1/"]
  • 好吧,我犯了一个愚蠢的错误,我离开了COPY ["ProjectApi/ProjectApi.csproj", "."] 而不是COPY ["ProjectApi/ProjectApi.csproj", "ProjectApi/"] 非常感谢,效果很好。
猜你喜欢
  • 1970-01-01
  • 2019-01-03
  • 2021-05-12
  • 1970-01-01
  • 1970-01-01
  • 2011-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多