我有以下 Docker 文件来构建一个托管在 Linux 容器上的 .NET Core Web 应用程序 -
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY ["ARP.API.Policies/ARP.API.Policies.csproj", "ARP.API.Policies/"]
RUN dotnet restore "ARP.API.Policies/ARP.API.Policies.csproj"
COPY . .
WORKDIR "/src/ARP.API.Policies"
RUN dotnet build "ARP.API.Policies.csproj" -c Release -o /app
FROM build AS publish
RUN dotnet publish "ARP.API.Policies.csproj" -c Release -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "ARP.API.Policies.dll"]
我的本地开发机器正在以 Linux 容器模式运行适用于 Windows 的 Docker Desktop。这里一切正常。当我尝试在实际的 Linux 系统上运行相同的 Docker 构建时(在本例中,它是运行 ubuntu 1604 的构建服务器),它会失败并显示错误:
COPY 失败:stat /var/lib/docker/tmp/docker-builder791807544/ARP.API.Policies/ARP.API.Policies.csproj:没有此文件或目录 /usr/bin/docker 失败,返回代码:1
任何想法都非常感谢。请注意,我的项目结构包含要复制的文件“ARP.API.Policies.csproj”和同一级别的 Dockerfile。
答案1
您说的是 .csproj 与 Dockerfile 位于同一目录中,但是您列出的 Dockerfile 在子目录 ARP.API.Policies 中引用它。
当您将其复制到 Ubuntu 框时,是否有可能稍微重新排列了一些内容,也许只复制了 ARP.API.Policies 目录并将 Dockerfile 放入其中?
如果是这种情况,你可以简单地使用
COPY ARP.API.Policies.csproj ./
WORKDIR /src
此外,在本地机器上构建 WSL 也非常有用。Windows VS Code 与 WSL 配合得很好:https://code.visualstudio.com/docs/remote/wsl
答案2
在这种情况下,Azure Devops 构建管道中 Docker 构建任务中的构建上下文属性必须设置为 $(System.DefaultWorkingDirectory)。默认情况下,它设置为 ** - 构建上下文