我尝试用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"]
我的文件目录
2条答案
按热度按时间yks3o0rb1#
您的Dockerfile有很多问题。提供"unknown switch“的是publish语句,在那里您将项目文件名指定为
/Api.csproj
。它应该是./Api.csproj
。正如其他人所指出的,您的WORKDIR使用Windows语法,但是您正在构建一个Linux映像,因此应该使用Linux语法。
将项目发布到
./
,这意味着最终会有一个包含源代码和已发布项目的目录。您希望将它们分开,以便只将已发布项目复制到最终映像中。这些变化,你最终会得到
p8h8hvxi2#
我假设您在
Api.csproj
文件夹中有构建上下文。首先,-WORKDIR设置容器中的当前工作目录。它不是主机系统上的目录。您从一个目录开始,在该目录中您将源代码从构建上下文复制到容器。它的好名称为/src请注意,为了优化构建过程并使用缓存,最好从仅复制 *. csproj文件开始,然后恢复依赖项。因为源代码比应用程序的依赖项更改得更频繁。
接下来,您需要在容器中的某个位置构建/发布应用程序,通常您会为此创建新目录,而不使用系统根目录:
最后一步--你应该把发布的应用程序复制到运行时容器中。这里你把当前目录设置为发布的应用程序将要所在的目录:
不要忘记公开API使用的端口。
停靠文件: