我尝试为 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*
我已尝试使用此问题中提到的解决方案,但它对我不起作用!
从错误描述来看,问题似乎是由 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
会导致图像尺寸更大。
我在尝试将其部署到 Kubernetes (EKS) 上时遇到了同样的错误。当我在本地构建映像并且 EKS 使用 Docker 公共注册表中的映像时,一切正常。但是,当我设置 CI/CD 来编译它时,在 EKS 环境上部署期间出现错误。我不确定这个问题背后的原因,特别是考虑到我使用 Docker 清单推送映像。