.net Dockerfile未在CMD中执行dotnet命令
我正在尝试运行Dockerfile来构建、发布和运行dotnet核心应用程序。Dockerfile如下所示:.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/
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 "$@"