.NET Core 3.0 Web API无法在Docker容器中启动

时间:2019-12-11 18:48:57

标签: docker .net-core

我对Docker感到很新鲜,试图获得在我的机器上运行的概念容器的证明。我使用命令dotnet new webapi生成了.NET Core 3.0 Web API项目。我添加了一个控制器端点,该端点仅返回字符串“ Hello World”。

using System;
using Microsoft.AspNetCore.Mvc;

namespace DockerHelloWorld.Controllers
{
    [ApiController]
    [Route("api/[controller]")]
    public class ValuesController : ControllerBase
    {

        [HttpGet]
        public string Get()
        {
            return "Hello World!";
        }
    }
}

我能够分别使用dotnet builddotnet run成功构建和运行该项目。

我现在正在尝试使其在Docker容器中运行。这是我的Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build-env
WORKDIR /app

# Copy csproj and restore as distinct layers
COPY *.csproj ./
RUN dotnet restore

# Copy everything else and build
COPY . ./
RUN dotnet publish --framework netcoreapp3 --configuration Release --output out

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.0
WORKDIR /app
COPY --from=build-env /app/out .
ENTRYPOINT ["dotnet", "DockerHellWorld.dll"]

这是从here复制并稍作修改的。

我也有以下.dockerignore,以防相关:

bin\
obj\

*.md
*.png

我运行以下命令:

docker build -t dockerhelloworldimage .

docker create -p 3000:80 --name dockerhelloworldcontainer dockerhelloworldimage

docker start dockerhelloworldcontainer

似乎每个步骤都是根据docker build的输出来运行的。在docker create之后返回哈希值,在docker run之后返回“ dockerhelloworldcontainer”。

容器立即停止。我通过使用docker container ls -a命令看到了这一点。

docker logs dockerhelloworldcontainer具有以下输出:“找不到任何已安装的.NET Core SDK。您是要运行.NET Core SDK命令吗?请从以下位置安装.NET Core SDK:{{3} }”,但我真的不知道该如何理解。

值得一提的是,我在使用.NET Core 2.2应用程序时获得了与之非常相似的东西。

有什么想法吗?我可能会缺少什么?

2 个答案:

答案 0 :(得分:2)

注释中提到的@Zied问题是您要从入口点命令调用的程序集名称中的错字。

如果您在docker文件上修复了该问题,

# All other content remains the same

ENTRYPOINT ["dotnet", "DockerHelloWorld.dll"]

您将成功启动容器。

  

列出正在运行的容器:docker ps显示:

CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                                                   NAMES
7dcb5c122445        dockerhelloworldimage   "dotnet DockerHelloW…"   5 minutes ago       Up 4 minutes        0.0.0.0:3000->80/tcp                                    dockerhelloworldcontainer

现在,这看起来像是一个误导性的错误消息,但是,如果您尝试从CLI(而不是从docker)实际运行错误的dotnet可执行文件,则:

> dotnet MyNonExistingExeName.dll

您将收到以下消息:

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-.\bin\Debug\netcoreapp3.0\DockerHellWorld.dll 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.

我认为第二和第三项适用于本案。这意味着如果您具有dotnet可执行文件(或全局/本地工具),则可以使用dotnet命令运行它们,因此问题在于您的命令被解释为不存在的工具或命令,并且因此是错误。

希望这会有所帮助!

答案 1 :(得分:0)

运行以下命令以在Docker上部署示例Dotnet Web API代码

docker-compose build
docker-compose up

Dockerfile

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

FROM mcr.microsoft.com/dotnet/core/sdk:3.0-buster AS build
COPY ./SampleWebApi3.0.csproj /SampleWebApi3.0/
RUN dotnet restore ./SampleWebApi3.0/SampleWebApi3.0.csproj
COPY . ./SampleWebApi3.0/
WORKDIR /SampleWebApi3.0/
RUN dotnet build "SampleWebApi3.0.csproj" -c Release -o /app/build

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SampleWebApi3.0.dll"]

docker-compose.yml

version: '3.5'

services:
    sample-web-api:
        build: SampleWebApi3.0/
        restart: always
        ports:
            - "8085:80"

Sample web API code 3.0 along with Dockerfile on Github