我对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 build
和dotnet 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应用程序时获得了与之非常相似的东西。
有什么想法吗?我可能会缺少什么?
答案 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"