【问题标题】:Docker errors when trying to build in ARM64 Apple M1: "Failed to resolve full path of the current executable [/proc/self/exe]"尝试在 ARM64 Apple M1 中构建时出现 Docker 错误:“无法解析当前可执行文件的完整路径 [/proc/self/exe]”
【发布时间】:2022-04-29 02:51:14
【问题描述】:

我在 Apple M1 上构建 docker 容器时遇到问题 该项目使用与 arm64 架构不兼容的 sdk 2.2。因此,我将 sdk 和 aspnet 核心更改为 2.2-alpine3.8,它们似乎构建正常,但在需要发布时进程失败

docker 文件:

FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine3.8 AS build-env
WORKDIR /app
# Copy csproj and restore as distinct layers
COPY . .
RUN dotnet publish src/admin/MyContainer.Admin.csproj -c Release -o ./publish

# Build runtime image
FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine3.8
WORKDIR /app
COPY --from=build-env /app/src/admin/publish .

# Copy script that allows waiting for the database on docker-compose
# As referenced here https://docs.docker.com/compose/startup-order/
# This was done because admin starts up very quickly on e2e env
# and the sqlserver container wasn't getting ready fast enough
COPY --from=build-env /app/docker-wait-for-it.sh .

EXPOSE 80
CMD ["dotnet", "MyContainer.Admin.dll"]

我使用的构建命令是:

docker buildx build --platform linux/arm64/v8 -t MyContainer.azurecr.io/admin-api-web:development ./backend -f ./backend/Admin.Api.Web.Dockerfile

日志输出为:

[+] Building 0.5s (11/13)                                                                                                                                                                                                                   
 => [internal] load build definition from Admin.Api.Web.Dockerfile                                                                                                                                                                     0.0s
 => => transferring dockerfile: 46B                                                                                                                                                                                                    0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                      0.0s
 => => transferring context: 34B                                                                                                                                                                                                       0.0s
 => [internal] load metadata for mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine3.8                                                                                                                                                    0.1s
 => [internal] load metadata for mcr.microsoft.com/dotnet/core/sdk:2.2-alpine3.8                                                                                                                                                       0.1s
 => [build-env 1/4] FROM mcr.microsoft.com/dotnet/core/sdk:2.2-alpine3.8@sha256:1299ac0379146c1de7b588196727dbd56eace3abfbdd4321c547c9ff4a18a2f7                                                                                       0.0s
 => => resolve mcr.microsoft.com/dotnet/core/sdk:2.2-alpine3.8@sha256:1299ac0379146c1de7b588196727dbd56eace3abfbdd4321c547c9ff4a18a2f7                                                                                                 0.0s
 => [stage-1 1/4] FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine3.8@sha256:4d6e528f4c09c55804b6032ecc5d60565a3ee16f68bb08d2cf337dff99cdb8c3                                                                                      0.0s
 => => resolve mcr.microsoft.com/dotnet/core/aspnet:2.2-alpine3.8@sha256:4d6e528f4c09c55804b6032ecc5d60565a3ee16f68bb08d2cf337dff99cdb8c3                                                                                              0.0s
 => [internal] load build context                                                                                                                                                                                                      0.2s
 => => transferring context: 473.91kB                                                                                                                                                                                                  0.1s
 => CACHED [stage-1 2/4] WORKDIR /app                                                                                                                                                                                                  0.0s
 => CACHED [build-env 2/4] WORKDIR /app                                                                                                                                                                                                0.0s
 => CACHED [build-env 3/4] COPY . .                                                                                                                                                                                                    0.0s
 => ERROR [build-env 4/4] RUN dotnet publish src/admin/MyContainer.Admin.csproj -c Release -o ./publish                                                                                                                                  0.1s
------
 > [build-env 4/4] RUN dotnet publish src/admin/MyContainer.Admin.csproj -c Release -o ./publish:
#11 0.127 Failed to resolve full path of the current executable [/proc/self/exe]

我已经在 --platform 标志上尝试了不同的平台,但也没有指定任何平台...如果我尝试使用 core 2.2 构建,我会得到以下输出:

[+] Building 0.5s (4/4) FINISHED                                                                                                                                                                                                            
 => [internal] load build definition from Admin.Api.Web.Dockerfile                                                                                                                                                                     0.0s
 => => transferring dockerfile: 745B                                                                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                                                                      0.0s
 => => transferring context: 34B                                                                                                                                                                                                       0.0s
 => ERROR [internal] load metadata for mcr.microsoft.com/dotnet/core/aspnet:2.2                                                                                                                                                        0.4s
 => CANCELED [internal] load metadata for mcr.microsoft.com/dotnet/core/sdk:2.2                                                                                                                                                        0.4s
------
 > [internal] load metadata for mcr.microsoft.com/dotnet/core/aspnet:2.2:
------
error: failed to solve: failed to solve with frontend dockerfile.v0: failed to create LLB definition: no match for platform in manifest sha256:08xxx: not found

我发现这是因为核心 2.2 不支持 arm64。但是这个文件在英特尔 MacBook 上构建没有任何错误,但使用 M1 我无法克服构建错误。有什么想法吗?

【问题讨论】:

  • 到目前为止,我遇到的唯一解决方案是更新容器以使用 .NET5 版本

标签: docker asp.net-core dockerfile apple-m1 .net-core-sdk


【解决方案1】:

这不是一个答案,而是对问题的跟进, 这可能会更清楚地说明这个问题。

我正在使用 aspnet:6,它通过了构建。

后面的问题是可运行的 .dll 抛出

cannot execute binary file: Exec format error

这似乎是一个平台问题,使用带有 M1 Silicon 芯片组的 Mac。

我对为 linux/amd64 制作的其他 docker 映像没有任何问题

Docker 守护进程似乎可以很好地处理这个问题(已安装 Rosetta2 和 M1 的最新 Docker 桌面) https://docs.docker.com/desktop/mac/apple-silicon/

您是否设法解决了问题并执行了 dll?

【讨论】:

  • 我和我的团队找到的解决方案是更新到 .NET5 或更高版本……使用 .NET2 构建无法正常工作,因为它太落后了,而且与 M1 芯片完全不兼容。 .. 到目前为止,.NET5 没有问题,我也在使用最新的 docker 桌面和 Rosetta 2。根据我的阅读,.NET6 将解决 M1 的大多数(如果不是全部)兼容性问题
猜你喜欢
  • 2010-11-04
  • 2019-05-03
  • 2022-12-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2019-11-07
相关资源
最近更新 更多