Docker镜像构建成功但启动时提示npm not found,求排查原因
问题原因与解决方法
问题根源
- 你在
RUN命令中临时export了NVM_DIR,但这个变量仅在当前RUN的shell进程中有效,不会被保存为镜像的全局环境变量。后续ENV指令里的$NVM_DIR会被解析为空字符串,导致PATH没有正确包含npm所在的目录。 - 进入容器时你使用的是bash,它会自动加载
~/.bashrc(nvm安装脚本已将环境变量配置写入该文件),因此能找到npm;但启动时的CMD采用shell形式执行,Docker会用/bin/sh -c运行命令,而/bin/sh不会加载~/.bashrc,再加上ENV设置的PATH无效,所以提示npm not found。
解决方法
修改Dockerfile,先将NVM_DIR设置为全局环境变量,确保后续ENV指令能正确解析变量:
ARG DEBIAN_FRONTEND=noninteractive FROM ubuntu:latest WORKDIR . COPY . /service/api/ RUN apt-get update -y && apt-get install -y openssl python3 curl ENV NODE_VERSION 16.19.1 # 先设置NVM_DIR为全局环境变量 ENV NVM_DIR /root/.nvm # install nvm RUN cd / && curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash && \ [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh" && nvm install $NODE_VERSION && \ cd /service/api/ && rm -rf node_modules && npm install ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules ENV PATH $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH ADD start.sh /start.sh CMD cd /service/api/ && npm start
另一种临时解决方案(不推荐,每次启动都要加载nvm脚本):将CMD改为使用bash并手动加载nvm环境:
CMD ["/bin/bash", "-c", ". $HOME/.nvm/nvm.sh && cd /service/api/ && npm start"]
内容的提问来源于stack exchange,提问作者Jerem Lachkar
相关产品推荐
相关产品推荐

