Docker buildx nodejs 失败

Gre*_*reg 6 node.js npm docker gitlab-ci buildx

我没有使用buildx太多,无法弄清楚这里发生了什么。当我在我的 intel Mac 上运行buildx构建时,arm64 的一切构建都很好,但是当我让 GitLab 运行程序在 amd64 服务器上进行构建时,它会失败。

[builder 4/6] RUN which node
0.514 /usr/local/bin/node
 DONE 0.6s

[builder 5/6] RUN node -v
0.633 v16.13.0
 DONE 0.7s

[builder 6/6] RUN npm install
0.360 Error while loading /usr/local/sbin/node: No such file or directory
Run Code Online (Sandbox Code Playgroud)

我看到 npm 正在寻找错误的位置,但为什么它在 GitLab 运行程序上寻找/usr/local/sbin/node,但在我的 Mac 上却在正确的路径中寻找?如果我只是运行的话,这个 Dockerfile 构建得很好。

$ docker build .
Run Code Online (Sandbox Code Playgroud)

本地命令:

$ docker buildx create --use
$ docker buildx build --platform linux/arm64 .
Run Code Online (Sandbox Code Playgroud)

GitLab Runner 构建环境

$ docker buildx create --platform linux/amd64,linux/arm64 --use
epic_wright

$ docker buildx ls
NAME/NODE      DRIVER/ENDPOINT      STATUS   PLATFORMS
epic_wright *  docker-container              
  epic_wright0 tcp://localhost:2375 inactive linux/amd64*, linux/arm64*
default        docker                        
  default      default              running  linux/amd64, linux/386
Run Code Online (Sandbox Code Playgroud)

Dockerfile

FROM node:16.13.0-bullseye

ARG GITLAB_AUTH_TOKEN

COPY ./app /app
WORKDIR /app

RUN which node
RUN node -v
RUN npm install
Run Code Online (Sandbox Code Playgroud)

.gitlab-ci.yml

image: eventngine/docker-buildx

stages:
  - build

variables:
  DOCKER_DRIVER: overlay2
  DOCKER_TLS_CERTDIR: ""
  DOCKER_HOST: tcp://localhost:2375

build:
  stage: build
  services:
    - name: docker:19.03.12-dind
      command: ["--experimental"]
  script:
    - docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
    - docker buildx create --use
    - docker buildx build -t "$CI_REGISTRY_IMAGE:v${CI_COMMIT_SHA:0:8}" --build-arg GITLAB_AUTH_TOKEN=$CI_JOB_TOKEN  --platform linux/arm64 --push .
  only:
    - main
Run Code Online (Sandbox Code Playgroud)

将不胜感激任何想法,非常感谢!

小智 5

当在 buildx 构建期间遇到类似的问题时npm install,我能够解决

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

之后,我在我npm install尝试构建的所有架构上都运行得很好。