vanblog
vanblog copied to clipboard
[问题反馈]: docker镜像打包失败
问题描述 | Describe the bug
官方提供的dockerfile和pnpm-lock文件存在冲突,无法顺利的进行docker打包。 /Dockerfile 下的 FROM node:18 AS WEBSITE_BUILDER 就无法执行,当我手动改为 node:18-alpine后尝试继续构建镜像, 出现关于sharp包的报错,
39.35 Progress: resolved 1191, reused 0, downloaded 1191, added 1191, done 41.34 .../node_modules/vue-demi postinstall$ node ./scripts/postinstall.js 41.81 .../[email protected]/node_modules/sharp install$ (node install/libvips && node install/dll-copy && prebuild-install) || (node install/can-compile && node-gyp rebuild && node install/dll-copy) 42.83 .../node_modules/vue-demi postinstall: Done 42.86 .../[email protected]/node_modules/sharp install: sharp: Installation error: Invalid Version: 1.2.4_git20230717 42.86 .../[email protected]/node_modules/sharp install: sharp: Please see https://sharp.pixelplumbing.com/install for required dependencies 42.95 .../[email protected]/node_modules/sharp install: Failed 42.96 ELIFECYCLE Command failed with exit code 1.
Dockerfile:53
51 | RUN pnpm config set fetch-retries 20 -g 52 | RUN pnpm config set fetch-timeout 600000 -g 53 | >>> RUN pnpm install --frozen-lockfile 54 | RUN pnpm build:website 55 |
ERROR: failed to solve: process "/bin/sh -c pnpm install --frozen-lockfile" did not complete successfully: exit code: 1
不知道是什么原因导致的
复现网址 | Website URL
No response
版本 | Version
最新版本
部署方式? | How do you deploy vanblog?
Docker 部署(文档默认)
请使用 Markdown 文本框框上错误报告,这样的形式不便于人类阅读。
GPT4:
出现您提到的问题,主要原因可能与sharp
包在安装过程中对依赖项版本的特定要求有关,特别是在 Alpine Linux 环境中。Alpine Linux 由于其轻量级和安全性而受到许多开发人员的喜爱,但是它使用的 musl libc 和其他基础工具与标准的 GNU/Linux 发行版不同,这可能会导致某些 Node.js 包安装时遇到问题。以下是解决这一问题的几个步骤:
1. 安装必需的依赖项
sharp
依赖于一些本地库,如libvips
。Alpine 版本的 Node 镜像不会预装这些库,所以你需要手动安装它们。你可以在Dockerfile
中添加如下命令来安装这些必需的依赖:
FROM node:18-alpine AS WEBSITE_BUILDER
# 安装 build 依赖
RUN apk add --no-cache libc6-compat g++ make python3 py3-pip vips-dev fftw-dev gcc libc-dev autoconf automake libtool nasm build-base zlib-dev
# 接下来是你的安装指令
2. 使用 npm 替代 pnpm
虽然pnpm
是一个很好的包管理工具,提供了比npm
和yarn
更快的安装速度和更好的磁盘空间利用率,但有时它可能会在处理某些依赖或子依赖时遇到问题。作为测试,尝试使用npm
而不是pnpm
来看是否能解决问题:
# 使用 npm 安装依赖
RUN npm install --frozen-lockfile
如果你坚持使用pnpm
,确保它是最新版本,因为pnpm
经常更新以解决类似的问题。
3. 检查 sharp 版本
确保你使用的sharp
版本与你的 Node.js 版本兼容。有时候,指定一个不同版本的sharp
可能就能解决安装问题。你可以查看sharp
的官方文档或在package.json
中指定一个兼容的版本号。
4. 使用预编译的 binary
sharp
通常会尝试下载预编译的二进制文件以避免编译过程。确保在构建过程中网络连接没有问题,以便sharp
能够下载所需的二进制文件。如果自动下载失败,你可能需要手动下载并指定二进制文件的路径。
5. 最后的 Dockerfile 样例
结合上述建议,你的Dockerfile
可能会像这样:
FROM node:18-alpine AS WEBSITE_BUILDER
# 安装依赖项
RUN apk update && apk add --no-cache libc6-compat g++ make python3 py3-pip vips-dev fftw-dev gcc libc-dev autoconf automake libtool nasm build-base zlib-dev
# 设置工作目录
WORKDIR /app
# 复制项目文件
COPY . .
# 安装依赖
RUN npm install --frozen-lockfile
# 构建应用
RUN npm run build:website
# 继续你的部署步骤...
如果这些步骤仍然无法解决问题,请确保检查sharp
的安装日志和官方文档,寻找可能的特定于 Alpine 的解决方案。