.net Dockerfile未在CMD中执行dotnet命令

.net Dockerfile未在CMD中执行dotnet命令,.net,docker,asp.net-core,.net-core,docker-compose,.net,Docker,Asp.net Core,.net Core,Docker Compose,我正在尝试运行Dockerfile来构建、发布和运行dotnet核心应用程序。Dockerfile如下所示: FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.5-buster-slim AS base WORKDIR /app EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["src/SomeDirectory/

我正在尝试运行Dockerfile来构建、发布和运行dotnet核心应用程序。Dockerfile如下所示:

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.5-buster-slim AS base
WORKDIR /app
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["src/SomeDirectory/Some.csproj", "src/SomeDirectory/"]
COPY ["src/SomeDirectory/copy-certificate.sh", "copy-certificate.sh"]
RUN dotnet restore "src/SomeDirectory/Some.csproj"
COPY . .
WORKDIR "/src/src/SomeDirectory"
RUN dotnet build "Some.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "Some.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
COPY --from=build /src/copy-certificate.sh copy-certificate.sh
ENTRYPOINT [ "/bin/bash", "copy-certificate.sh" ]
CMD ["dotnet", "Some.dll"]
在运行
dotnet Some.dll
命令之前,我想在
copy certificate.sh
中执行一个aws命令,将证书复制到容器中的某个位置。因此,我添加了以下shell脚本作为Dockerfile的入口点:

证书副本。sh:

#!/bin/sh
aws s3 cp s3://key/certificate.crt /root/directory/certificate.crt
exec "$@"
创建容器后,我尝试运行
docker start$container

但是,在检查容器日志时,我在这一步
CMD[“dotnet”,“Some.dll”]
中不断遇到此错误:

It was not possible to find any installed .NET Core SDKs
  Did you mean to run .NET Core SDK commands? Install a .NET Core SDK from:
      https://aka.ms/dotnet-download

我是码头工人的新手。如果我做错了什么,请纠正我。

这里发生的事情是,
CMD
中的值作为参数传递给
入口点中的命令。当您启动容器时,它实际上是在执行以下操作:

/bin/bash copy-certificate.sh dotnet Some.dll
ENTRYPOINT
是启动容器时执行的命令。在本例中,
CMD
是默认情况下传递给该命令的参数,前提是在运行容器时未提供参数

由于脚本具有
exec“$@”
调用,因此脚本正在处理
dotnet Some.dll的执行。由于您看到的错误而失败的原因可能是您的工作目录中不存在某个.dll或其名称不同。我建议添加
RUN
指令以输出
/app
目录以验证其内容:

COPY --from=publish /app/publish .
RUN ls
您使用这些说明的方式不是推荐的做事方式。我建议你多读一读说明书和说明,以及它们是如何使用的

更好的方法是完全删除脚本,并在构建容器映像时运行aws命令。您可以将
final
阶段更改为以下内容(假设您更正了某些.dll的路径):


我发现包含
dotnet Some.dll
的一个解决方法是将它添加到copy-certificate.sh,方法是在linux服务器中用它的完整路径替换
dotnet
/usr/bin/dotnet

证书副本。sh

#!/bin/sh
aws s3 cp s3://key/certificate.crt /root/directory/certificate.crt
/usr/bin/dotnet Some.dll
exec "$@"

并删除
Dockerfile

中的
CMD[“dotnet”,“Some.dll”]
部分使用不同的图像将
CMD[“dotnet”,“Some.dll”]
更改回
入口点[“dotnet”,“Some.dll”]
。然后在
复制之后创建
运行aws s3 cp s3://key/certificate.crt/root/directory/certificate.crt
命令,您必须在构建容器中添加aws依赖项,包括
RUN apt get install aws
或其他任何内容。好吧……为什么会出现这种情况……有什么原因吗?感谢您的解释……我添加了linux的dotnet path
/usr/bin/dotnet Some.dll
,并将其添加到了copy certificate.sh中……这很有效。我希望每次在docker文件上使用run命令时,都执行这个
/usr/bin/dotnet Some.dll
。因此,这需要存在于copy-certificate.sh中
#!/bin/sh
aws s3 cp s3://key/certificate.crt /root/directory/certificate.crt
/usr/bin/dotnet Some.dll
exec "$@"