Docker构建.NET项目时跳过.Core依赖项目的问题求助
Docker构建跳过TooSee.Web.Core项目的问题排查与解决
问题原因
你的Dockerfile位于C:\Users\nemes\Documents\GitHub\tooseeapi\src\TooSee.Web.Host,执行docker build -t tooseeapi .时,构建上下文是当前的TooSee.Web.Host文件夹,COPY . .只会把Host项目的文件复制到容器的/app目录。而TooSee.Web.Core项目在同级的TooSee.Web.Core文件夹,完全没被复制到容器环境中,因此dotnet构建时找不到依赖的Core项目,只能跳过。
本地执行dotnet publish正常是因为本地环境中,Host目录下的../TooSee.Web.Core能直接访问到本地的Core项目文件,但容器内没有这个路径的文件。
解决方法
方案1:调整构建上下文(推荐)
- 切换到
C:\Users\nemes\Documents\GitHub\tooseeapi\src目录执行构建命令,让上下文包含Host和Core两个项目:
docker build -t tooseeapi -f TooSee.Web.Host/Dockerfile .
- 修改Dockerfile中的路径配置:
FROM mcr.microsoft.com/dotnet/sdk:6.0 as builder WORKDIR /app # 上下文为src目录,COPY会同步两个项目文件 COPY . . RUN apt-get update;apt-get install curl; apt-get -y install zip RUN curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip" RUN unzip awscliv2.zip RUN ./aws/install ENV PATH="${PATH}:/root/.dotnet/tools" #RUN dotnet tool install -g AWS.CodeArtifact.NuGet.CredentialProvider # #RUN dotnet codeartifact-creds install # #RUN aws codeartifact login --tool dotnet --domain monspire --domain-owner 986853728599 --repository monspire RUN dotnet restore # 指定正确的项目相对路径 RUN dotnet publish -c Release TooSee.Web.Host/TooSee.Web.Host.csproj # 构建运行容器 FROM mcr.microsoft.com/dotnet/sdk:6.0 # 安装依赖 RUN apt-get update \ && apt-get install -y --allow-unauthenticated \ libc6-dev \ libgdiplus \ libx11-dev \ && rm -rf /var/lib/apt/lists/* WORKDIR /app # 修正发布产物路径(原Dockerfile误用了Debug目录) COPY --from=builder /app/TooSee.Web.Host/bin/Release/net6.0/publish/ . ARG ENVIRONMENT ENV ENVIRONMENT=${ENVIRONMENT} EXPOSE 80 CMD ["dotnet", "TooSee.Web.Host.dll"]
方案2:修改COPY命令(不推荐,上下文冗余)
如果不想切换构建目录,可以修改Dockerfile的COPY命令,从上级目录同步文件,但需确保构建上下文包含上级目录:
# 替换原有的COPY . . COPY ../ .
这种方式会同步src目录下所有内容,但会引入冗余文件,不如方案1简洁可控。
关键修正点
原Dockerfile中COPY --from=builder的路径误用了Debug目录,但你执行的是-c Release发布,必须改成Release目录,否则会找不到发布产物。
内容的提问来源于stack exchange,提问作者Eugene Sukh
相关产品推荐
相关产品推荐

