.net dotnet aspnetcore docker构建失败,错误代码为145

x7yiwoj4  于 2023-03-13  发布在  .NET
关注(0)|答案(5)|浏览(143)

我已经使用this tutorial创建了我的第一个docker webapi项目。
我用的是windows7(docker工具箱)。
这是我的实验结果

dotnet new webapi

这是Docker文件:

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
新的停靠文件如下所示:

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错误。

svdrlsy4

svdrlsy41#

您正在使用的映像仅包含.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。

bbuxkriu

bbuxkriu2#

在我的情况下是一个愚蠢的错误,但也许可以帮助别人。我改变了项目名称,这打破了docker组成。所以,网页应用程序的文件夹,项目(这是.csproj文件)和DLL运行dotnet应该有相同的名称在我的情况下,因为我在docker文件中使用一个变量,假设。总之,仔细审查的名称,我们正在使用的每件事。

34gzjxbg

34gzjxbg3#

我收到此错误是因为Dockerfiledocker-compose.yml之间存在 * 差异。
停靠文件(原始):

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

我更改了Dockerfile以将文件移动到nginx的默认目录...
停靠文件(更改):

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
oalqel3c

oalqel3c4#

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

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

程序集名称不正确。

68bkxrlz

68bkxrlz5#

我通过引用sdk而不是docker compose上的aspnet解决了问题
使用此:从mcr.microsoft.com/dotnet/sdk:6.0-bullseye-slim作为发布
而不是这样:来自mcr.microsoft.com/dotnet/aspnet:6.0-bullseye-slim作为发布

相关问题