dotnet aspnetcore docker build失败,出现145错误代码

时间:2017-02-20 13:56:52

标签: .net docker asp.net-core docker-toolbox

我使用this tutorial创建了我的第一个docker webapi项目。

我正在使用Windows 7(docker toolbox)。

这就是我跑过的地方:

dotnet new webapi

这是Dockerfile:

FROM microsoft/dotnet:latest
COPY . /app
WORKDIR /app

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]

EXPOSE 5000/tcp
ENV ASPNETCORE_URLS http://*:5000

ENTRYPOINT ["dotnet", "run"]

这是我创建图片的方式:

docker build -t mydemos:aspnetcorehelloworld .

这就是我创建和运行容器的方式:

docker run -d -p 8080:5000 -t mydemos:aspnetcorehelloworld

我的服务已成功作为docker容器运行。

然后,我尝试更改Dockerfile以处理aspnetcore基本映像:

FROM microsoft/dotnet:latest已更改为FROM microsoft/aspnetcore:1.0.1

新的Dockerfile看起来像:

FROM microsoft/aspnetcore:1.0.1
COPY . /app
WORKDIR /app

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]

EXPOSE 5000/tcp
ENV ASPNETCORE_URLS http://*:5000

ENTRYPOINT ["dotnet", "run"]

现在,我尝试使用

构建新图像
docker build -t mydemos:aspnetcorehelloworld1 .

我收到错误。
这是构建日志:

Sending build context to Docker daemon 636.9 kB
Step 1/8 : FROM microsoft/aspnetcore:1.0.1
 ---> 2c7bbc508bb2
Step 2/8 : COPY . /app
 ---> Using cache
 ---> 1d5b9bd908b3
Step 3/8 : WORKDIR /app
 ---> Using cache
 ---> c1d5d091d111
Step 4/8 : RUN dotnet restore
 ---> Running in 8399e21caeb2
Did you mean to run dotnet SDK commands? Please install dotnet SDK from:
  http://go.microsoft.com/fwlink/?LinkID=798306&clcid=0x409
The command 'dotnet restore' returned a non-zero code: 145

我进了网址,重新安装了东西,但我仍然收到错误 我试图在同一命令行会话中使用dotnet cli命令,但我成功了(dotnet restore有效)。

我试图搜索此错误,但无法找到任何解决方案。

我在这里缺少什么?我在多次和测试中得到了145错误。

4 个答案:

答案 0 :(得分:8)

您使用的图像仅包含.NET Core运行时,而不包含SDK。尝试以下存储库中的基本映像:

https://hub.docker.com/r/microsoft/aspnetcore-build/

您的Dockerfile中包含以下行:

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]

这表示dotnet restoredotnet build命令正在您正在使用的图片中运行。由于您使用的图像没有安装SDK,因此您无法找到这些命令,因为您看到了这些命令。我上面链接的存储库中的图像中安装了SDK,因此可以找到并执行dotnet restoredotnet build命令。

在安装SDK的情况下使用基本映像的替代方法是在开发计算机上执行构建/发布过程,然后将已发布的输出复制到映像中。然后,您的Dockerfile只需要查看以下内容:

FROM microsoft/aspnetcore:1.0.1
WORKDIR /app
COPY ./app .
ENTRYPOINT ["dotnet", "TheNameOfYourProject.dll"]

请注意,现在在映像中运行的dotnet命令只是运行(预构建的)DLL的命令。这只需要运行时,而不是SDK。

答案 1 :(得分:1)

我收到此错误的原因是 Dockerfile docker-compose.yml 之间的差异。

Dockerfile(原始):

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /app
...

我更改了Dockerfile,将文件移动到nginx的默认目录...

Dockerfile(更改):

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /usr/share/nginx/html
...

但是docker-compose.yml引用了旧文件夹...

docker-compose.yml(原始):

services:
  web:
    working_dir: /app

要修复此问题,只需更新working_dir以指向新目录...

docker-compose.yml(修复):

services:
  web:
    working_dir: /usr/share/nginx/html

答案 2 :(得分:0)

在我看来,这是一个愚蠢的错误,但也许可以帮助某人。 我更改了项目名称,这破坏了docker compose。 因此,在我的情况下,Web应用程序的文件夹,项目(它是.csproj文件)和与dotnet一起运行的DLL应该具有相同的名称,因为我在dockerfile中使用了一个假定该变量的名称。 总结一下,仔细检查一下我们用于每件事物的名称。

答案 3 :(得分:0)

就我而言,我重命名了程序集名称,这造成了失败。我注意到Dcokerfile的最后一行

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

assembly_name不正确。