Docker 容器运行失败,出现错误:错误:重定位 /node_modules/argon2/lib/binding/napi-v3/argon2.node 时出错:不支持的重定位类型 7

问题描述 投票:0回答:2

我尝试为 Nestjs 服务器和 prisma 构建自定义 docker 镜像。但是在使用构建的映像运行容器时,它会抛出以下错误:

node:internal/modules/cjs/loader:1280
  return process.dlopen(module, path.toNamespacedPath(filename));
                 ^

Error: Error relocating /node_modules/argon2/lib/binding/napi-v3/argon2.node: unsupported relocation type 7
    at Object.Module._extensions..node (node:internal/modules/cjs/loader:1280:18)
    at Module.load (node:internal/modules/cjs/loader:1074:32)
    at Function.Module._load (node:internal/modules/cjs/loader:909:12)
    at Module.require (node:internal/modules/cjs/loader:1098:19)
    at require (node:internal/modules/cjs/helpers:108:18)
    at Object.<anonymous> (/node_modules/argon2/argon2.js:9:25)
    at Module._compile (node:internal/modules/cjs/loader:1196:14)
    at Object.Module._extensions..js (node:internal/modules/cjs/loader:1250:10)
    at Module.load (node:internal/modules/cjs/loader:1074:32)
    at Function.Module._load (node:internal/modules/cjs/loader:909:12) {
  code: 'ERR_DLOPEN_FAILED'
}

Dockerfile 看起来像:

FROM --platform=linux/x86_64 node:16 AS builder

WORKDIR /app

COPY package*.json ./
COPY prisma ./prisma/
COPY .env ./

RUN yarn

RUN yarn global add peer

COPY . .

RUN yarn run build

FROM node:16-alpine

COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/dist ./dist

EXPOSE 8002 8001 9000

CMD [ "yarn", "start:prod" ]

Docker 镜像构建命令:

docker build -t nest-server .

Docker容器运行命令:

docker run -p 8002:8002 -p 8001:8001 nest-server

环境详情:

OS: OSX Ventura 13.3.1
Docker version: 20.10.24
NestJS: 9.0.0

.dockerignore 文件内容:

# See https://help.github.com/articles/ignoring-files/ for more about ignoring files.

# dependencies
/node_modules
/.pnp
.pnp.js

# testing
/coverage

# production
/build

# misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*

我已尝试使用此问题中提到的解决方案,但它对我不起作用!

docker nestjs prisma
2个回答
0
投票

从错误描述来看,问题似乎是由 argon2 库引起的,该库是一个本机模块,需要特定于平台的二进制文件。当您使用

node:16
映像构建 Docker 映像时,您正在 Linux x86_64 平台上进行构建。但是,当您在第二阶段使用
node:16-alpine
图像时,您使用的是不同的平台,这可能会导致与argon2本机模块不兼容。

我建议您将第二阶段更改为使用

node:16
而不是
node:16-alpine
:

FROM node:16

COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package*.json ./
COPY --from=builder /app/dist ./dist

EXPOSE 8002 8001 9000

CMD [ "yarn", "start:prod" ]

这将确保 Docker 构建的两个阶段使用相同的平台。但是,使用

node:16
代替
node:16-alpine
会导致图像尺寸更大。


0
投票

我在尝试将其部署到 Kubernetes (EKS) 上时遇到了同样的错误。当我在本地构建映像并且 EKS 使用 Docker 公共注册表中的映像时,一切正常。但是,当我设置 CI/CD 来编译它时,在 EKS 环境上部署期间出现错误。我不确定这个问题背后的原因,特别是考虑到我使用 Docker 清单推送映像。

© www.soinside.com 2019 - 2024. All rights reserved.