Docker构建含node-crc的NestJS应用失败,已装Rust仍报错?
为NestJS项目编写了如下Dockerfile,因依赖"node-crc": "2.0.13",执行docker build时构建失败。
FROM node:17.3.1-alpine RUN curl https://sh.rustup.rs -sSf | sh -s -- -y ENV PATH="/root/.cargo/bin:${PATH}" WORKDIR /usr/src/app RUN npm install -g @nestjs/cli COPY package.json ./ RUN yarn install ...SOME OTHER CMDs NOT IMPORTANT TO CASE
在Win11本地项目目录执行yarn install无报错,Node运行正常,但通过WSL 2.0构建Docker镜像时出现以下错误:
> [6/8] RUN yarn install: #11 102.3 [4/4] Building fresh packages... #11 102.7 error /usr/src/app/node_modules/node-crc: Command failed. #11 102.7 Exit code: 1 #11 102.7 Command: npm run build:neon #11 102.7 Arguments: #11 102.7 Directory: /usr/src/app/node_modules/node-crc #11 102.7 Output: #11 102.7 > node-crc@2.0.13 build:neon #11 102.7 > cargo-cp-artifact -nc index.node -- cargo build --release --message-format=json-render-diagnostics #11 102.7 #11 102.7 Error: could not find the `cargo` executable. #11 102.7 #11 102.7 You can find instructions for installing Rust and Cargo at: #11 102.7 #11 102.7 https://www.rust-lang.org/tools/install #11 102.7 #11 102.7 #11 102.7 Did not copy "cdylib:node-crc" #11 102.7 info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.
明明已通过RUN curl https://sh.rustup.rs -sSf | sh -s -- -y安装了Rust-Cargo构建依赖,为何还会出现这种情况?
核心原因
Docker的RUN指令是在独立的Shell进程中执行的,安装Rust的RUN执行完毕后,进程直接终止,后续的RUN指令无法继承该进程内的环境变量变更。
你虽然配置了ENV PATH="/root/.cargo/bin:${PATH}",但这里的${PATH}是Docker构建上下文初始的默认PATH值,并非rustup安装后更新的PATH。另外,Alpine镜像默认使用ash Shell,rustup安装脚本会将Cargo路径写入~/.profile或~/.bashrc,但Docker的RUN指令默认是非交互式Shell,不会自动加载这些配置文件,导致后续yarn install找不到cargo命令。
解决步骤
合并Rust安装与环境变量加载到同一个RUN指令,确保Cargo路径在当前Shell中生效:
RUN curl https://sh.rustup.rs -sSf | sh -s -- -y && \ source $HOME/.cargo/env直接在ENV中指定Cargo路径,rustup默认将Cargo安装到
/root/.cargo/bin,可以直接写死路径:ENV PATH="/root/.cargo/bin:${PATH}"注意该
ENV指令要放在RUN yarn install之前。补充Alpine编译依赖,node-crc编译需要gcc、musl-dev等工具,Alpine默认未预装,需手动安装:
RUN apk add --no-cache gcc musl-dev
内容的提问来源于stack exchange,提问作者alexzedim

