Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net dotnet aspnetcore docker生成失败,错误代码为145_.net_Docker_Asp.net Core_Docker Toolbox - Fatal编程技术网

.net dotnet aspnetcore docker生成失败,错误代码为145

.net dotnet aspnetcore docker生成失败,错误代码为145,.net,docker,asp.net-core,docker-toolbox,.net,Docker,Asp.net Core,Docker Toolbox,我曾经创建过我的第一个docker webapi项目 我正在使用Windows7(docker工具箱) 这就是我跑过的: 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

我曾经创建过我的第一个docker webapi项目

我正在使用Windows7(docker工具箱)

这就是我跑过的:

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基础映像上工作:

microsoft/dotnet:latest的
已从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
我进入了url,重新安装了内容,但仍然出现错误。
我尝试在同一命令行会话中使用dotnet cli命令,但成功了(
dotnet restore
works)

我试图搜索这个错误,但实际上找不到任何解决方案


我错过了什么?我在多个场合和测试中都遇到了这个错误。

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


Dockerfile中包含以下行:

RUN ["dotnet", "restore"]
RUN ["dotnet", "build"]
这意味着
dotnet restore
dotnet build
命令正在您使用的映像中运行。由于您正在使用的映像没有安装SDK,因此无法找到这些命令,正如您所看到的那样,这些命令会失败。我上面链接的存储库中的图像中安装了SDK,因此可以找到并执行
dotnet restore
dotnet build
命令

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

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

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

在我的例子中,这是一个愚蠢的错误,但也许可以帮助别人。 我更改了项目名称,这打断了docker撰写。 因此,在我的例子中,web应用程序的文件夹、项目(它是.csproj文件)和与dotnet一起运行的DLL应该具有相同的名称,因为我在dockerfile中使用的一个变量假定是这样的。
总之,仔细检查我们为每件事使用的名称。

我收到这个错误是因为Dockerfiledocker compose.yml之间存在差异

Dockerfile(原件):

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

Dockerfile(更改):

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

docker-compose.yml(原件):

要修复它,只需更新工作目录以指向新目录

docker-compose.yml(修复):


在我的例子中,我重命名了程序集名称,这导致了失败。我注意到文件的最后一行

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

组件名称不正确。

谢谢您的回答,但请让我了解一些情况。我正在尝试基于另一个docker映像构建一个docker映像,该映像包含我需要的运行时。我知道构建过程需要SDK,但为什么我需要包含SDK的基本映像?@AmirPopovich我在答案中添加了更多细节,如果您有任何其他问题,请告诉我。非常好的解释!!!非常感谢你。最后一个问题:是否存在只包含运行时和SDK的较小映像?有什么方法可以从docker文件中的命令添加2吗?@AmirPopovich据我所知,SDK有点笨重。不过,随着时间的推移,将构建过程编入Dockerfile肯定会带来回报,您必须考虑在您的环境下,这一成本是否值得。无法使用多个from命令从两个图像派生,但是您可以链接图像(Dockerfile A派生自Dockerfile B,Dockerfile B派生自Dockerfile C-将其视为洋葱层。)@多项式我面临类似问题这也是我的问题,区分大小写,因此,名称大小写也应该相同。
FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /usr/share/nginx/html
...
services:
  web:
    working_dir: /app
services:
  web:
    working_dir: /usr/share/nginx/html
ENTRYPOINT ["dotnet", "assembly_name.dll"]