You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 17:53:10