Docker 运行命令抛出和错误消息

问题描述 投票:0回答:3

我正在使用 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
3个回答
4
投票

请查看 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"]
    

0
投票
检查入口点文件名的大小写是否正确

ENTRYPOINT [“dotnet”,“

DotNetTesting.dll”]


0
投票
我只是想把它放在那里,尽管它可能是一个小众用例。

我修改了 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 .
而且,直到我扔掉容器并重新构建它之后,这个问题才显现出来,这让我非常困惑,因为事情突然崩溃了。

© www.soinside.com 2019 - 2024. All rights reserved.