在docker中安装nvm

 mobiledu2502936307 发布于 2022-12-20 19:28

我正在构建一个新的Docker镜像,我希望安装NVM,这样我就可以管理nodejs.

阅读有关如何安装NVM的文档,他们提到您需要获取.bashrc文件才能开始使用NVM.

我试图在Dockerfile中设置它,但到目前为止构建失败并出现错误:

"bash:nvm:命令未找到"

以下是我的Dockerfile中的相关行:

ADD files/nvm_install.sh /root/
RUN chmod a+x  /root/nvm_install.sh
RUN bash -c "/root/nvm_install.sh"
RUN bash -l -c "source /root/.bashrc"
RUN cd /root
RUN bash -l -c "nvm install 0.10.31"

以下是尝试构建的输出:

docker build -t nginx_dock.

Step 0 : FROM ubuntu
---> 826544226fdc
Step 1 : MAINTAINER dficociello
---> Using cache
---> da3bc340fbb3
Step 2 : RUN apt-get update
---> Using cache
---> 6b6b611feb4f
Step 3 : RUN apt-get install nginx curl -y
---> Using cache
---> 159eb0b16d23
Step 4 : RUN touch /root/.bashrc
---> Using cache
---> 5e9e8216191b
Step 5 : ADD files/nginx.conf /etc/nginx/
---> Using cache
---> c4a4a11296a2
Step 6 : ADD files/nvm_install.sh /root/
---> Using cache
---> b37cba2a18ca
Step 7 : RUN chmod a+x  /root/nvm_install.sh
---> Using cache
---> bb13e2a2893d
Step 8 : RUN bash -c "/root/nvm_install.sh"
---> Using cache
---> 149b49a8fc71
Step 9 : RUN bash -l -c "source /root/.bashrc"
---> Running in 75f353ed0d53
---> 0eae8eae7874
Removing intermediate container 75f353ed0d53
Step 10 : RUN cd /root
---> Running in feacbd998dd0
---> 284293ef46b0
Removing intermediate container feacbd998dd0
Step 11 : RUN bash -l -c "nvm install 0.10.31"
---> Running in 388514d11067
bash: nvm: command not found
2014/09/17 13:15:11 The command [/bin/sh -c bash -l -c "nvm install 0.10.31"] returned a non-zero         code: 127

我对Docker很陌生,所以我可能会遗漏编写Dockerfiles的基本内容,但到目前为止,我所做的所有阅读都没有给我一个很好的解决方案.

谢谢

9 个回答
  • 当您RUN bash...每次在单独的进程中运行时,不会维护环境中设置的任何内容.这是我安装的方式nvm:

    # Replace shell with bash so we can source files
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh
    
    # Set debconf to run non-interactively
    RUN echo 'debconf debconf/frontend select Noninteractive' | debconf-set-selections
    
    # Install base dependencies
    RUN apt-get update && apt-get install -y -q --no-install-recommends \
            apt-transport-https \
            build-essential \
            ca-certificates \
            curl \
            git \
            libssl-dev \
            wget \
        && rm -rf /var/lib/apt/lists/*
    
    ENV NVM_DIR /usr/local/nvm # or ~/.nvm , depending
    ENV NODE_VERSION 0.10.33
    
    # Install nvm with node and npm
    RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.20.0/install.sh | bash \
        && . $NVM_DIR/nvm.sh \
        && nvm install $NODE_VERSION \
        && nvm alias default $NODE_VERSION \
        && nvm use default
    
    ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
    ENV PATH      $NVM_DIR/v$NODE_VERSION/bin:$PATH
    

    2022-12-20 19:28 回答
  • RUNDockerfile中的每个都在不同的容器中执行.因此,如果您在容器中提供文件,则其内容将在下一个文件中不可用.

    这就是为什么当您安装应用程序并且需要执行多个步骤时,必须在同一容器中执行此操作.

    用你的例子:

    ADD files/nvm_install.sh /root/
    RUN chmod a+x /root/nvm_install.sh && \
      /root/nvm_install.sh && \
      source /root/.bashrc && \
      cd /root && \
      nvm install 0.10.31
    

    2022-12-20 19:28 回答
  • 自接受的答案以来,Nvm路径已发生变化,因此如果您想使用更新的nvm版本,则需要进行一些更改.此外,没有必要重新映射sh使其工作:

    ENV NVM_DIR /usr/local/nvm
    RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.1/install.sh | bash
    ENV NODE_VERSION v7.9.0
    RUN /bin/bash -c "source $NVM_DIR/nvm.sh && nvm install $NODE_VERSION && nvm use --delete-prefix $NODE_VERSION"
    
    ENV NODE_PATH $NVM_DIR/versions/node/$NODE_VERSION/lib/node_modules
    ENV PATH      $NVM_DIR/versions/node/$NODE_VERSION/bin:$PATH
    

    不确定你是否需要--delete-prefix选项nvm use- 我做了,但这对我的基本图像可能有些奇怪.

    2022-12-20 19:28 回答
  • 为了帮助每个人都在寻找在Ubuntu(最新版本)上使用NVM安装Node.js的方法,我在下面创建了dockerfile.我正在使用最新版本的Docker,Ubuntu,Node.js,并且NVM正常工作($ PATH已修复).我在生产环境中使用它.

    $ docker info \
    Server Version: 1.9.1
    Kernel Version: 4.1.13-boot2docker
    Operating System: Boot2Docker 1.9.1 (TCL 6.4.1); master : cef800b - Fri Nov 20 19:33:59 UTC 2015
    
    Node.js Version: stable 4.2.4 LTS
    Ubuntu Version: 14.04.3
    


    dockerfile:

    FROM ubuntu:14.04.3
    
    # Replace shell with bash so we can source files
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh
    
    # make sure apt is up to date
    RUN apt-get update --fix-missing
    RUN apt-get install -y curl
    RUN apt-get install -y build-essential libssl-dev
    
    ENV NVM_DIR /usr/local/nvm
    ENV NODE_VERSION 4.2.4
    
    # Install nvm with node and npm
    RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.30.1/install.sh | bash \
        && source $NVM_DIR/nvm.sh \
        && nvm install $NODE_VERSION \
        && nvm alias default $NODE_VERSION \
        && nvm use default
    
    ENV NODE_PATH $NVM_DIR/v$NODE_VERSION/lib/node_modules
    ENV PATH      $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
    
    RUN mkdir /usr/app
    RUN mkdir /usr/app/log
    
    WORKDIR /usr/app
    
    # log dir
    VOLUME /usr/app/log
    
    # Bundle app source
    COPY . /usr/app
    # Install app dependencies
    RUN npm install
    
    EXPOSE  3000
    CMD ["node", "server.js"]
    

    2022-12-20 19:29 回答
  • 我必须从这样一个事实开始,即我搜索到了一个nvm内部的工作示例,但docker我没有找到.即使这个帖子中的答案也行不通.

    所以,我花了很长时间想出一个有效的方法:

    # install dependencies
    RUN apt-get update && apt-get install -y \
          curl \
          npm \
          nodejs \
          git;
    
    # compatibility fix for node on ubuntu
    RUN ln -s /usr/bin/nodejs /usr/bin/node;
    
    # install nvm
    RUN curl https://raw.githubusercontent.com/creationix/nvm/v0.24.1/install.sh | sh;
    
    # invoke nvm to install node
    RUN cp -f ~/.nvm/nvm.sh ~/.nvm/nvm-tmp.sh; \
        echo "nvm install 0.12.2; nvm alias default 0.12.2" >> ~/.nvm/nvm-tmp.sh; \
        sh ~/.nvm/nvm-tmp.sh; \
        rm ~/.nvm/nvm-tmp.sh;
    

    注意我也是如何安装nodejsvia的apt-get.我发现有些软件包没有安装在docker中,除非这样做.

    2022-12-20 19:31 回答
  • 尝试在问题中获取nvm命令之间的关键区别:

    RUN bash -l -c "source /root/.bashrc"
    

    哪个不起作用,并尝试在接受的答案中做同样的事情:

    source $NVM_DIR/nvm.sh
    

    是第二个版本直接来源nvm.sh脚本,而原始版本尝试通过.bashrc文件来完成.

    .bashrc文件在它的早期有一行,如果它在非交互式shell中运行则退出:

    # If not running interactively, don't do anything
    case $- in
        *i*) ;;
        *) return;;
    esac
    

    所以它永远不会得到它会产生nvm.sh的位,它实际上将nvm命令放在你的shell中.

    如果docker在非交互式shell中运行这些东西,我不会感到惊讶.这没有明确指出,所以我想我会提到它,因为当我做与流浪汉类似的事情时,它是什么引起了我的注意.

    2022-12-20 19:31 回答
  • 根据@Kuhess答案中的建议,我在我的Dockerfile中用以下代码替换了source命令

    RUN cat ~/.nvm/nvm.sh >> installnode.sh
    RUN echo "nvm install 0.10.35" >> installnode.sh
    RUN sh installnode.sh
    

    2022-12-20 19:31 回答
  • 这是基于最佳答案,并在2018年工作:

    # Replace shell with bash so we can source files
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh
    
    # Install base dependencies
    RUN apt-get update && apt-get install -y -q --no-install-recommends \
            apt-transport-https \
            build-essential \
            ca-certificates \
            curl \
            git \
            libssl-dev \
            wget
    
    ENV NVM_DIR /usr/local/nvm
    ENV NODE_VERSION 8.11.3
    
    WORKDIR $NVM_DIR
    
    RUN curl https://raw.githubusercontent.com/creationix/nvm/master/install.sh | bash \
        && . $NVM_DIR/nvm.sh \
        && nvm install $NODE_VERSION \
        && nvm alias default $NODE_VERSION \
        && nvm use default
    
    ENV NODE_PATH $NVM_DIR/versions/node/v$NODE_VERSION/lib/node_modules
    ENV PATH      $NVM_DIR/versions/node/v$NODE_VERSION/bin:$PATH
    

    请注意,这nvm不是bash命令,而是别名.如果你依赖,这可能会搞砸你$PATH.

    2022-12-20 19:31 回答
  • 这是我的工作版本

    FROM ubuntu:14.04
    
    # Declare constants
    ENV NVM_VERSION v0.29.0
    ENV NODE_VERSION v5.0.0
    
    # Replace shell with bash so we can source files
    RUN rm /bin/sh && ln -s /bin/bash /bin/sh
    
    # Install pre-reqs
    RUN apt-get update
    RUN apt-get -y install curl build-essential
    
    # Install NVM
    RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/${NVM_VERSION}/install.sh | bash
    
    # Install NODE
    RUN source ~/.nvm/nvm.sh; \
        nvm install $NODE_VERSION; \
        nvm use --delete-prefix $NODE_VERSION;
    

    从@abdulljibali和@shamisis的答案中获得帮助.

    2022-12-20 19:31 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有