You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker中dotnet publish报错:无法找到项目或解决方案文件

问题:Docker构建.NET镜像时dotnet publish报错"Specify a project or solution file"

背景

我正尝试让.NET应用在Linux容器中运行,最终部署到Azure Container Instances,完全没容器经验,看文档示例很懵,已经装了Docker Desktop,现在卡在创建Docker镜像这一步。

项目结构

  • MyProject
    • MyProject.Core
    • MyProject.Api
    • MyProject.sln
    • Dockerfile

当前Dockerfile内容

#Use Ubuntu Linux as base
FROM ubuntu:22.10

#Install dotnet6
RUN apt-get update && apt-get install -y dotnet6
#Install LibreOffice
RUN apt-get -y install default-jre-headless libreoffice

#Copy the source code
WORKDIR /MyProject
COPY . ./

#Compile the application
RUN dotnet publish -c Release -o /compiled

#ENV PORT 80

#Expose port 80
EXPOSE 80

ENTRYPOINT ["dotnet", "/compiled/MyProject.Api.dll"]

#ToDo: Split build and deployment

构建命令与错误

我用命令docker build - < Dockerfile构建镜像,前面步骤都正常,但执行dotnet publish时抛出错误:

Specify a project or solution file

这个命令在容器外运行没问题,我怀疑是文件复制环节出问题,改了WORKDIR路径也没用。


解决方案

问题根源

你用的docker build - < Dockerfile是从标准输入读取Dockerfile内容,这种模式下Docker不会把当前目录的文件作为构建上下文,所以COPY . ./根本没把项目文件复制到容器里,自然找不到.sln或.csproj文件。

正确构建命令

在MyProject目录下执行以下命令:

docker build -t myproject-api .

这里的.表示把当前目录作为构建上下文,Docker会把该目录下所有文件(除了.dockerignore排除的)打包传给构建进程,这样COPY . ./就能正确复制项目源码到容器中。

额外优化建议

  1. 使用多阶段构建:按照你Dockerfile里的TODO,拆分构建和部署阶段,用官方.NET SDK镜像构建、Runtime镜像运行,能大幅减小镜像体积:
# 构建阶段
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["MyProject.Api/MyProject.Api.csproj", "MyProject.Api/"]
COPY ["MyProject.Core/MyProject.Core.csproj", "MyProject.Core/"]
RUN dotnet restore "MyProject.Api/MyProject.Api.csproj"
COPY . .
WORKDIR "/src/MyProject.Api"
RUN dotnet publish -c Release -o /app/publish

# 运行阶段
FROM mcr.microsoft.com/dotnet/aspnet:6.0
RUN apt-get update && apt-get install -y default-jre-headless libreoffice
WORKDIR /app
COPY --from=build /app/publish .
EXPOSE 80
ENTRYPOINT ["dotnet", "MyProject.Api.dll"]
  1. 添加.dockerignore文件:在MyProject目录下创建.dockerignore,排除不需要复制到构建上下文的文件,减少构建时间和镜像大小:
bin/
obj/
.git/
Dockerfile
.dockerignore

内容的提问来源于stack exchange,提问作者Ryan Thomas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 23:15:29