.net 接收MSB1001时出现什么问题:尝试发布C#应用程序时出现未知开关?

mf98qq94  于 2023-01-31  发布在  .NET
关注(0)|答案(2)|浏览(158)

我尝试用Docker停靠我的Web API,遇到了错误MSB1001:未知的开关。可以在cmd提示符图像中找到详细信息
有人知道这意味着什么吗?我已经尝试在GitHub的讨论和StackOverflow的帖子中跟进这一点。
我的停靠文件:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR C:\Users\Alexa\OneDrive\Desktop\SortIT\Api

# Copy everything
COPY . .

# Restore as distinct layers
RUN dotnet restore "./Api.csproj"
RUN dotnet publish "/Api.csproj" -c release -o ./

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY --from=build /Api .

ENTRYPOINT ["dotnet", "Api.dll"]

我的文件目录

yks3o0rb

yks3o0rb1#

您的Dockerfile有很多问题。提供"unknown switch“的是publish语句,在那里您将项目文件名指定为/Api.csproj。它应该是./Api.csproj
正如其他人所指出的,您的WORKDIR使用Windows语法,但是您正在构建一个Linux映像,因此应该使用Linux语法。
将项目发布到./,这意味着最终会有一个包含源代码和已发布项目的目录。您希望将它们分开,以便只将已发布项目复制到最终映像中。
这些变化,你最终会得到

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src

# Copy everything
COPY . .

# Restore as distinct layers
RUN dotnet restore "./Api.csproj"
RUN dotnet publish "./Api.csproj" -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:6.0
COPY --from=build /src/out .

ENTRYPOINT ["dotnet", "Api.dll"]
p8h8hvxi

p8h8hvxi2#

我假设您在Api.csproj文件夹中有构建上下文。首先,-WORKDIR设置容器中的当前工作目录。它不是主机系统上的目录。您从一个目录开始,在该目录中您将源代码从构建上下文复制到容器。它的好名称为/src

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src # current directory in the container
COPY . . # Copy everything from build context to /src
RUN dotnet restore "Api.csproj"

请注意,为了优化构建过程并使用缓存,最好从仅复制 *. csproj文件开始,然后恢复依赖项。因为源代码比应用程序的依赖项更改得更频繁。
接下来,您需要在容器中的某个位置构建/发布应用程序,通常您会为此创建新目录,而不使用系统根目录:

#publish app to folder /publish 
RUN dotnet publish "Api.csproj" -c release -o /publish

最后一步--你应该把发布的应用程序复制到运行时容器中。这里你把当前目录设置为发布的应用程序将要所在的目录:

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app #now set the current directory to /app
COPY --from=build /publish  . #copy from build stage to /app

不要忘记公开API使用的端口。
停靠文件:

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src 

COPY "Api.csproj" .    
RUN dotnet restore "Api.csproj"

COPY . .
RUN dotnet publish "Api.csproj" -c release -o /publish 

FROM mcr.microsoft.com/dotnet/aspnet:6.0
WORKDIR /app
EXPOSE 80
COPY --from=build /publish  . 

ENTRYPOINT ["dotnet", "Api.dll"]

相关问题