如何通过docker run执行nvm?镜像运行nvm提示找不到的问题
解决Docker容器中无法执行nvm命令的问题
问题描述
基于Ubuntu 20.04构建的Docker镜像已全局安装nvm和最新LTS Node.js,其他功能正常,但执行以下命令时:
docker run -ti myimage:latest nvm
会报错:
--: line 0: exec: nvm: not found
原Dockerfile内容:
FROM ubuntu:20.04 ARG DEBIAN_FRONTEND=noninteractive ENV NVM_DIR='/usr/local/nvm' RUN mkdir -pv "$NVM_DIR" && \ apt-get -yq clean && apt-get -q update && \ apt-get -yq --no-install-recommends install curl ca-certificates git-core && \ curl -o- 'https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh' | bash && \ . "$NVM_DIR/nvm.sh" && \ nvm install --default --latest-npm 'lts/*' && \ apt-get -yq clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* ENTRYPOINT ["bash", "-c", ". /usr/local/nvm/nvm.sh && { [ \"x$*\" = 'x' ] || { exec ${@} ; exit $? ; } ; } && bash", "--"]
问题原因
nvm本质是bash函数,不是系统PATH中存在的可执行文件。原ENTRYPOINT中使用exec ${@}直接执行传入的命令时,会跳过shell函数的加载逻辑,导致系统无法识别nvm命令。
解决方案
修改ENTRYPOINT逻辑,确保传入的命令在已经加载nvm.sh的bash环境中执行,而不是直接exec。
修改后的Dockerfile
FROM ubuntu:20.04 ARG DEBIAN_FRONTEND=noninteractive ENV NVM_DIR='/usr/local/nvm' RUN mkdir -pv "$NVM_DIR" && \ apt-get -yq clean && apt-get -q update && \ apt-get -yq --no-install-recommends install curl ca-certificates git-core && \ curl -o- 'https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh' | bash && \ . "$NVM_DIR/nvm.sh" && \ nvm install --default --latest-npm 'lts/*' && \ apt-get -yq clean && \ rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* # 调整ENTRYPOINT,让命令在加载nvm后的bash环境中执行 ENTRYPOINT ["bash", "-c", ". /usr/local/nvm/nvm.sh && if [ -n \"$*\" ]; then bash -c \"$*\"; else bash; fi", "--"]
验证方法
重新构建镜像后,执行以下命令测试:
docker build -t myimage:latest . docker run -ti myimage:latest nvm --version
此时应该能正常输出nvm的版本信息,说明问题解决。
内容的提问来源于stack exchange,提问作者Darko Miletic
相关产品推荐
相关产品推荐

