我正在使用 docker 构建并运行我的 .Net Core 3.1 控制台应用程序。这是一个简单的 Hello World 应用程序:
using System;
namespace DockerTesting
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Hello World!");
Console.ReadLine();
}
}
}
这是我的 docker 文件:
FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
WORKDIR /src
COPY . .
ENTRYPOINT ["dotnet", "DockerTesting"]
这也很简单,只需获取基础映像并将应用程序复制到 WORKDIR 中即可。我使用 Powershell 构建并运行图像。
PS ~: docker build -t testingdocker .
Sending build context to Docker daemon 7.168kB
Step 1/4 : FROM mcr.microsoft.com/dotnet/sdk:3.1 AS build
---> 6bb83e9aa359
Step 2/4 : WORKDIR /src
---> Running in 4c3319712cf8
Removing intermediate container 4c3319712cf8
---> cf1ab373e085
Step 3/4 : COPY . .
---> 1c6a846459d8
Step 4/4 : ENTRYPOINT ["dotnet", "DockerTesting"]
---> Running in 56e335f09bc2
Removing intermediate container 56e335f09bc2
---> 2ef84c282ac0
Successfully built 2ef84c282ac0
Successfully tagged testingdocker:latest
PS ~: docker run testingdocker
尝试运行图像后,我收到以下错误消息:
Could not execute because the specified command or file was not found.
Possible reasons for this include:
* You misspelled a built-in dotnet command.
* You intended to execute a .NET Core program, but dotnet-DockerTesting does not exist.
* You intended to run a global tool, but a dotnet-prefixed executable with this name could not be found on the PATH.
但是当我通过 VS 运行该应用程序时,它就像一个魅力。
请查看 Docker 文档中的.NET Core 应用程序示例 Dockerfile。
在您的 Dockerfile 中,您缺少构建(和发布部分),这通常希望作为 Docker 构建过程的一部分来完成。此外,您在.dll
中缺少项目名称末尾的
ENTRYPOINT
。尝试将您的替换为与此类似的内容(某些路由可能需要调整,这假设 Dockerfile 放置在 .csproj 级别并且该项目没有其他依赖项):
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
WORKDIR /app
# Copy .csproj and restore
COPY *.csproj ./
RUN dotnet restore
# Copy everything else and publish
COPY . ./
RUN dotnet publish -c Release -o out
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "DockerTesting.dll"]
ENTRYPOINT [“dotnet”,“
DotNetTesting.dll”]
我修改了 Dockerfile 以安装一堆 dotnet 的监控工具:
RUN dotnet tool install --tool-path /tools dotnet-trace \
&& dotnet tool install --tool-path /tools dotnet-counters \
&& dotnet tool install --tool-path /tools dotnet-dump \
&& dotnet tool install --tool-path /tools dotnet-gcdump
# [...]
WORKDIR /app
COPY --from=publish /app/publish .
WORKDIR /tools
COPY --from=publish /tools .
现在,我的问题是我在/app/publish
之后复制了工具,所以发生的情况是我的入口点在
/tools
目录而不是
/app
中查找我的二进制文件。交换两者解决了问题:
WORKDIR /tools
COPY --from=publish /tools .
WORKDIR /app
COPY --from=publish /app/publish .
而且,直到我扔掉容器并重新构建它之后,这个问题才显现出来,这让我非常困惑,因为事情突然崩溃了。