首页 > 解决方案 > 获取“您的意思是运行 dotnet SDK 命令吗?请从以下位置安装 dotnet SDK”

问题描述

我正在尝试将 .net MVC 应用程序容器化,但是当我运行图像时出现如下错误

user@tuser:~/sam/WebApp$ docker run -p 8000:80 sam:latest

您的意思是运行 dotnet SDK 命令吗?请从以下位置安装 dotnet SDK: https ://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

用户@用户:~/sam/WebApp$

我的Dockerfile样子

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
COPY /bin/Release/Publish /app
ENTRYPOINT ["dotnet", "WebApp.dll"]

我哪里错了?

标签: dockerdockerfile

解决方案


迟到的答案,但很常见的问题,所以我会回答。

如果入口点中的 dll 目标参数不存在,通常会发生这种情况。如果您要导出、打包和重新导入资产,还有其他可能性,但这可能不是我们在这里处理的内容。

在您的情况下,复制操作指向根相对文件位置。我假设您没有发布到 {system root/}bin/Release/Publish,并且您的 dockerfile 位于项目的根目录中。

为了解决这个问题,您应该相对于您的 dockerfile 所在的目录执行复制操作,并使用目录相对路径 (./etc) 指定复制操作。

根据我的测试工作的示例:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
COPY ./bin/Release/Publish /app
ENTRYPOINT ["dotnet", "WebApi.dll"]

要查看它是否有效,请通过使用 cmd 覆盖启动来检查生成的容器:

docker run -it --rm sam:latest /bin/sh
...
pwd #ensure workdir is app
ls -la #ensure that your application is copied here

如果您想深入调查,可以使用 docker run 覆盖您的入口点并尝试不同的启动配置以查看输出。您需要的命令如下:

docker run -it --rm --entrypoint {dotnet executable} {image}:{tag} {non-existent dll}

通过在其他工作容器上覆盖以不存在的 dll 为目标时的输出示例:

➜ docker run -it --rm --entrypoint dotnet sam:latest weebles.dll
Did you mean to run dotnet SDK commands? Please install dotnet SDK from:
  https://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409

推荐阅读