起因
事情是这样的,在项目中安装了一个用于压缩图片的vite插件vite-plugin-imagemin 想让项目打包之后的体积更小。
经过
在本地运行npm run build后一切正常,也可以看到图片压缩之后的信息。
在看到效果之后,感觉就可以发到测试环境去了,但是考虑到公司CICD用的是Docker,于是就先在本地用docker build -f DockerfileTest -t project:v1 .先试一下,没想到就出现问题了。
在构建镜像的过程中一直提示缺少文件。
然后就开始寻找解决办法,在外网上搜索,发现大部分都是说报错跟运行环境有关,因为在docker虚拟机中不包含支持这个插件的运行环境。
这个时候我才想起来,docker build并不是在本地运行的,而是在远端的docker引擎中运行的。同时,我在Dockerfile中只引入了NodeJS的运行环境,并没有系统的支持,所以就会抛出这个错误了。
结果
意识到是这个问题之后,我就在Dockerfile的开头添加了--platform=linux/amd64 指定运行环境
FROM --platform=linux/amd64 node:16.19.0-alpine3.17
但是没有生效 = = ,所以就先把这个插件删掉,这个问题就暂且搁置了。
插曲
中间在一直构建失败的时候,我还怀疑是npm的问题,所以就把npm换成了pnpm,
当时的Dockerfile是这样的:
FROM node:16.19.0-alpine3.17
RUN npm install -g pnpm anywhere && mkdir -p /home/app/
WORKDIR /home/app/
COPY package*.json ./
RUN pnpm install --frozen-lockfile
COPY . .
RUN pnpm run build:test
EXPOSE 8000
CMD anywhere -p 8000 -d ./dist -s
然后,确实抛出了新的错误...
我当时又懵了,看了一眼项目的根目录,pnpm-lock.yaml不是就在那吗!为啥还会找不到!
后来发现还是docker build的问题,因为在Dockerfile里面只把package*.json文件添加到构建镜像所需的文件中,但是指定了pnpm只下载lockfile中的依赖,但是pnpm需要的lock文件是pnpm-lock.yaml,所以pnpm就无法找到对应的lock文件去下载依赖,只好报错了。
于是我就改了一下Dockerfile
...
COPY package*.json pnpm-lock.yaml ./
RUN pnpm install --frozen-lockfile
...
把这些依赖文件都COPY进来,这样就保证不管是npm还是pnpm都可以正常下载依赖了。
!