繁体   English   中英

在 Docker 容器中运行 dotnet publish 会出现“ld.so 检测到不一致”错误

[英]Running dotnet publish in Docker container gives "Inconsistency detected by ld.so" error

我正在尝试将我的 ASP.NET Core 项目之一从 .NET Core 2.2 升级到 3.1。 该项目使用 Docker 和 Microsoft .NET Core Docker 映像之一来构建 .NET 应用程序,并使用 Node.JS 映像来构建 JavaScript。 现在我已经将构建基础容器从mcr.microsoft.com/dotnet/core/sdk:2.2mcr.microsoft.com/dotnet/core/sdk:3.1 ,在容器中运行dotnet publish并带有任何参数返回以下错误:

Inconsistency detected by ld.so: dl-open.c: 689: _dl_open: Assertion `_dl_debug_initialize (0, args.nsid)->r_state == RT_CONSISTENT' failed!

Service 'web' failed to build: The command '/bin/sh -c dotnet publish -c Release -o out' returned a non-zero code: 127

我的 Dockerfile 看起来像这样:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
COPY ./src /app/src

FROM node:8.9.3 AS client-build
# do some npm install / node_modules stuff

FROM build-env as publish
COPY --from=client-build . .
WORKDIR /app/src/
RUN dotnet publish -c Release -o out

为什么dotnet publish失败?

这里有几个错误导致了这个错误。

首先,在发布步骤中的COPY操作之后设置WORKDIR 由于顺序很重要,因此COPY操作最终node:8.9.3映像(即 Debian 8)中的所有内容复制到基于dotnet/core/sdk:3.1 (Debian 10)的发布映像的根目录中。 这会导致在构建应用程序的 Dockerfile 时通常不应覆盖的内容被覆盖。

设置WORKDIR之前COPY操作将使目的地COPY相对于它,而不是相对于图像根。 然后,修复源路径以引用输出的 JS 包在client-build映像上的位置,显着减少了需要复制的内容。 在构建简单的应用程序映像时,使用绝对路径明确要COPY的源和目标文件夹/文件可能是最清楚的,而不是使用相对通配符,例如. . . .

另外,此处使用的节点图像已明显过时(截至撰写本文时,v12.x 是 LTS)。 尽管指定的节点版本足以运行npm installwebpack ,但webpack中的错误意味着不仅仅是输出的 JS 包在最终映像中结束,这是一个风险。 将节点映像更新到最新的 8.x 版本或基于 Debian 9 或 10 的更新的 LTS 版本隐藏了问题,但如果不需要,最好不要将内容从一个映像复制到另一个映像。 “从 .NET Core 2.2 升级到 .NET Core 3.1”似乎导致这个问题的原因仅仅是旧 Node 镜像中与 Debian 8 的不同,以及 .NET SDK 镜像中从 Debian 9 跳转到 10。

此处提供了与 .NET Docker 映像相关的其他示例: https : //github.com/dotnet/dotnet-docker/blob/master/samples/README.md

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM