M1 Mac构建含Prisma的Docker镜像时遇OpenSSL依赖错误
解决M1 Mac上Prisma + Node16 Slim Docker镜像的OpenSSL二进制目标错误
在M1芯片Mac上构建包含Prisma、基于node16-slim的Docker镜像,容器可正常挂载,但执行npm install或npm ci时出现如下错误:
bash-5.1# npm install > prepare > npm run prisma && ts-patch install -s 2>/dev/null || true > prisma > prisma generate --schema ./lib/database/myschema.prisma | prisma migrate dev --name init Error: Unknown binaryTarget linux-arm64-openssl-undefined and no custom engine files were provided Error: Unknown binaryTarget linux-arm64-openssl-undefined and no custom engine files were provided up to date, audited 523 packages in 2s 65 packages are looking for funding run `npm fund` for details
已尝试修改Dockerfile(改用node-slim镜像、用apt-get安装openssl),修改后的Dockerfile如下:
FROM node:16-slim as base WORKDIR /home ARG DATABASE_URL=postgresql://admin:admin@postgres:5432/sales RUN apt-get update && apt-get install -y \ bash \ nano \ curl \ python3 \ build-base \ openssl \ && rm -rf /var/lib/apt/lists/* RUN npm set cache /home/.npm && \ npm set progress false && \ npm set unsafe-perm true && \ npm set no-audit true && \ npm set prefer-offline true WORKDIR /home ADD .npm .npm ADD package.json . ADD package-lock.json . RUN npm ci --no-optional ADD . . RUN npm run build ######################################################################################################################## FROM node:16-slim as test WORKDIR /home COPY --from=base /home . ENTRYPOINT ["npm", "run"] ######################################################################################################################## FROM node:16-slim as development WORKDIR /home RUN apt-get update && apt-get install -y \ bash \ nano \ curl \ python3 \ build-base \ openssl \ && rm -rf /var/lib/apt/lists/* RUN npm set cache /home/.npm && \ npm set progress false && \ npm set unsafe-perm true && \ npm set no-audit true COPY --from=base /home . ENTRYPOINT ["npm", "run"] CMD ["shell"] ######################################################################################################################## FROM node:16-slim as prepare-production RUN apt-get update && apt-get install -y \ bash \ nano \ curl \ python3 \ build-base \ openssl \ && rm -rf /var/lib/apt/lists/* RUN npm set cache /home/.npm && \ npm set progress false && \ npm set unsafe-perm true && \ npm set no-audit true RUN apt-get install -y openssl WORKDIR /home COPY --from=base /home . RUN npm prune --production ######################################################################################################################## FROM node:16-slim as production WORKDIR /home COPY --from=prepare-production /home . ENTRYPOINT ["npm", "run"] CMD ["start"]
执行docker system prune并重新构建镜像后,问题依旧。
解决方案
1. 明确指定Prisma二进制目标
在项目的package.json中添加Prisma配置,指定适配linux-arm64的OpenSSL版本:
{ "prisma": { "binaryTargets": ["linux-arm64-openssl-1.1.x"] } }
也可以直接在Prisma命令中追加参数:
prisma generate --schema ./lib/database/myschema.prisma --binary-target linux-arm64-openssl-1.1.x
2. 在Dockerfile中设置Prisma环境变量
在base阶段的RUN npm ci --no-optional之前添加环境变量,确保安装过程中识别正确的目标平台:
ENV PRISMA_CLI_BINARY_TARGETS=linux-arm64-openssl-1.1.x
3. 升级Prisma版本(可选)
部分旧版Prisma对arm64架构的OpenSSL版本识别存在缺陷,升级到4.x及以上的稳定版本,可修复兼容性问题。修改package.json中的prisma和@prisma/client版本后,重新生成package-lock.json。
4. 指定Docker构建平台(M1专属)
M1为arm64架构,构建镜像时需明确指定平台,避免交叉编译导致的二进制不匹配:
docker build --platform linux/arm64 -t your-image-name .
或在Dockerfile开头直接声明平台:
FROM --platform=linux/arm64 node:16-slim as base
内容的提问来源于stack exchange,提问作者altho
相关产品推荐
相关产品推荐

