使用Docker buildx linux/arm64时,Npm安装失败

15

我正在从一台 x86_64 机器上构建 docker 镜像,以便在部署服务器(arm64)上使用。为了测试,我正在使用下面的 docker 文件。

FROM node:14.16.0-buster

RUN npm install pm2@latest -g

由于某些原因,npm install 失败了。我也尝试了 npm -v 但也失败了。请查看下面的控制台日志以获取更清楚的信息。

$~ docker buildx create --platform linux/arm64 --use --name arm64
arm64

$~ docker buildx ls
NAME/NODE DRIVER/ENDPOINT             STATUS   PLATFORMS
arm64 *   docker-container
  arm640  unix:///var/run/docker.sock inactive linux/arm64*
default   docker
  default default                     running  linux/amd64, linux/386
  
$~ docker buildx build --platform linux/arm64 -t fos-node --load .
[+] Building 146.3s (7/7) FINISHED
 => [internal] booting buildkit                                                                                                                                                       29.7s
 => => pulling image moby/buildkit:buildx-stable-1                                                                                                                                    28.6s
 => => creating container buildx_buildkit_arm640                                                                                                                                       1.1s
 => [internal] load build definition from Dockerfile                                                                                                                                   0.1s
 => => transferring dockerfile: 770B                                                                                                                                                   0.0s
 => [internal] load .dockerignore                                                                                                                                                      0.1s
 => => transferring context: 380B                                                                                                                                                      0.0s
 => [internal] load metadata for docker.io/library/node:14.16.0-buster                                                                                                                13.6s
 => [auth] library/node:pull token for registry-1.docker.io                                                                                                                            0.0s
 => [1/2] FROM docker.io/library/node:14.16.0-buster@sha256:e09a63130ce4ec4b20af5bd07e2029a0ef26f64f1f496f0854f5b1ff1aa69575                                                         102.0s
 => => resolve docker.io/library/node:14.16.0-buster@sha256:e09a63130ce4ec4b20af5bd07e2029a0ef26f64f1f496f0854f5b1ff1aa69575                                                           0.0s
 => => sha256:4d7f255f49584b155894f79821624b3502337e5825df64c3be03a07f04fb1691 282B / 282B                                                                                             0.4s
 => => sha256:ec755c817ff697a94525832b7ac0c6e41048d90ac0da7e9454a5fe5c1a04caf9 2.31MB / 2.31MB                                                                                         2.2s
 => => sha256:238768c628173281bc3162a29cef7923808d66159e7249d80620b4221632200b 34.64MB / 34.64MB                                                                                      33.4s
 => => sha256:754863281868391e5f6c82b8b29b874f9e1830f1919ac097ca6560a6ef747976 4.20kB / 4.20kB                                                                                         1.7s
 => => sha256:ccc089388c7ca4407aec7247a44601b896e57e96d53a858fb0e8c6f2f94ab8da 183.90MB / 183.90MB                                                                                    96.0s
 => => sha256:ba70c372ae296f23e908bf1e1ed9f4c0c81a8a6d7fc48c0e2db16035bb9b7a54 52.17MB / 52.17MB                                                                                      58.0s
 => => sha256:299f3631f6b52be065a7342da0a46978d55cbd0d15c57fae22f4ca24efcc295a 9.98MB / 9.98MB                                                                                        13.6s
 => => sha256:344d2d9a9cf41c137b0dbb41df255f95fb812a23771a10ee2ab5a8a5047c62c4 7.69MB / 7.69MB                                                                                        18.6s
 => => sha256:ef28e7e77ecbd3b3b426832bc12e8f5e629959683767466e9bac149c3286e126 49.23MB / 49.23MB                                                                                      59.1s
 => => extracting sha256:ef28e7e77ecbd3b3b426832bc12e8f5e629959683767466e9bac149c3286e126                                                                                              1.5s
 => => extracting sha256:344d2d9a9cf41c137b0dbb41df255f95fb812a23771a10ee2ab5a8a5047c62c4                                                                                              0.2s
 => => extracting sha256:299f3631f6b52be065a7342da0a46978d55cbd0d15c57fae22f4ca24efcc295a                                                                                              0.2s
 => => extracting sha256:ba70c372ae296f23e908bf1e1ed9f4c0c81a8a6d7fc48c0e2db16035bb9b7a54                                                                                              1.6s
 => => extracting sha256:ccc089388c7ca4407aec7247a44601b896e57e96d53a858fb0e8c6f2f94ab8da                                                                                              4.5s
 => => extracting sha256:754863281868391e5f6c82b8b29b874f9e1830f1919ac097ca6560a6ef747976                                                                                              0.0s
 => => extracting sha256:238768c628173281bc3162a29cef7923808d66159e7249d80620b4221632200b                                                                                              1.4s
 => => extracting sha256:ec755c817ff697a94525832b7ac0c6e41048d90ac0da7e9454a5fe5c1a04caf9                                                                                              0.1s
 => => extracting sha256:4d7f255f49584b155894f79821624b3502337e5825df64c3be03a07f04fb1691                                                                                              0.0s
 => ERROR [2/2] RUN npm install pm2@latest -g                                                                                                                                          0.3s
------
 > [2/2] RUN npm install pm2@latest -g:
------
Dockerfile:3
--------------------
   1 |     FROM node:14.16.0-buster
   2 |
   3 | >>> RUN npm install pm2@latest -g
   4 |
   5 |     # RUN mkdir -p /home/ubuntu
--------------------
error: failed to solve: rpc error: code = Unknown desc = executor failed running [/dev/.buildkit_qemu_emulator /bin/sh -c npm install pm2@latest -g]: exit code: 1

我认为在npm install之后发生了segmentation fault,因为运行docker build的主机shell是x86_64,这只是一个假设。欢迎任何帮助。

你找到任何解决方案了吗? - LoolKovsky
尝试使用此 https://hub.docker.com/r/arm32v7/node/ 32位版本。它可能有效。对于我的要求,它并不完全可行。@LoolKovsky - Sp4Rx
如果你感兴趣的话,我找到了一个解决方法。 - LoolKovsky
请在评论中发布或分享。 - Sp4Rx
我已经发布了。如果有帮助,请接受我的答案。谢谢! - LoolKovsky
2个回答

10

有点晚了,但对于所有遇到同样错误的人。请检查您是否安装了 buildx 的多平台支持:

docker run --privileged --rm tonistiigi/binfmt --install all

完整文档在 Docker 页面这里


你救了我的命! - Olivier
我的也被保存了!我花了好几个小时才搞定它!! - Fergal Moran
我原以为它只能解决Postgres问题,但它也可以解决Node.js问题。 - marko kraljevic

8

最近我一直面临这个问题,后来设法绕过了它。

首先,我安装了QEMU和其他依赖项:

apt-get install qemu qemu-user-static binfmt-support debootstrap -y

然后,我创建了一个专用的构建器:

docker buildx create --name armBuilder

并使用它:

docker buildx use armBuilder

在这之后,我在一些项目中遇到了连接错误,尤其是当涉及到较大的依赖项时,例如 @material-ui/icon。为了避免这种情况,我通过扩展超时设置来更改构建指令。

如果您正在使用npm,请将指令更改为:

npm install -timeout=600000

或者创建一个名为 .npmrc 的文件:

fetch-retry-maxtimeout=60000

你也可以像这样设置:

npm config set fetch-retry-maxtimeout 60000

这里描述了选项内容:https://docs.npmjs.com/cli/v6/using-npm/config#fetch-retry-mintimeout 不过,我建议使用更快的yarn。对于yarn:
yarn install --network-timeout 600000

或者创建一个 .yarnrc 文件:

network-timeout 600000

@Sp4Rx 很抱歉没能早点发布,但我没有足够的时间。如果您有更大的软件包,您需要耐心等待。一个构建过程花费了我半个小时,但它成功了。 - LoolKovsky
感谢您发布这个解决方案。您知道超时是针对每个软件包还是整个安装命令的吗? - Benjamin Haegenlaeuer
@BenjaminHaegenlaeuer yarn install --help 显示 "网络请求的TCP超时"。我理解为这是(某种程度上的)每个包的超时时间。 - Marcel Stör
@MarcelStör 这是 - LoolKovsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接