web-dev-qa-db-ja.com

dockerにnvmをインストールします

私は新しいDockerイメージを作成中です。nodejsを管理できるようにNVMをインストールしたいと思っています。

NVMのインストール方法に関するドキュメントを読むと、NVMの使用を開始するには、.bashrcファイルを入手する必要があることが記載されています。

私はこれを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を書くための基本的な何かを見逃しているかもしれませんが、これまでに行ったすべての読み取りでは、良い解決策が示されていません。

ありがとう

82

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
111
Abdullah Jibaly

Ubuntu(最後のバージョン)にNode.jsとNVMをインストールする方法を探しているすべての人を助けるために、私は以下の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 Sudo 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"]
24
danilodeveloper

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-prefixnvm useオプションが必要かどうかわからない-私はそうしましたが、それは私のベースイメージについて奇妙なことかもしれません。

20
Steve Campbell

Dockerfileの各RUNは、異なるコンテナで実行されます。そのため、コンテナ内のファイルをソースにした場合、そのコンテンツは次のコンテンツでは使用できません。

そのため、アプリケーションをインストールし、いくつかの手順を実行する必要がある場合、同じコンテナで実行する必要があります。

あなたの例では:

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
17
Kuhess

これはトップアンサーに基づいており、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に依存している場合、これはあなたを台無しにする可能性があります。

13
rjurney

これが私の作業バージョンです

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の回答から助けを借りました。

8
Tahir Rauf

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;

apt-get経由でnodejsもインストールしたことに注意してください。これを行わないと、いくつかのパッケージがdocker内にインストールされないことがわかりました。

@Kuhessの回答の提案に基づいて、Dockerfileでsourceコマンドを次のコマンドに置き換えました

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

問題のnvmコマンドを取得しようとする試みの主な違い:

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

これは機能せず、受け入れられた答えで同じことをしようとしています:

source $NVM_DIR/nvm.sh

2番目のバージョンはnvm.shスクリプトを直接ソースしますが、オリジナルは.bashrcファイルを介してそれを実行しようとします。

.bashrcファイルには、非対話型シェルで実行されている場合に終了する行が早い段階で含まれています。

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

そのため、実際にシェルにnvmコマンドを配置するnvm.shのソースとなるビットには到達しません。

Dockerがこのようなものを非対話型のシェルで実行していても驚かないでしょう。これは明示的に指摘されていなかったので、浮浪者と似たようなことをしているときにそれが私を捕まえたので、私はそれを言及すると思いました。

6
tobuslieven

python3-onbuildコンテナでは、nvmインストールへのシンボリックリンクを強制的に作成する必要がありました。

# Install npm and nodejs
RUN apt-get install -y build-essential libssl-dev

RUN mkdir /root/.nvm
ENV NVM_DIR /root/.nvm
ENV NODE_VERSION 8.9.4

RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.9/install.sh | bash
RUN chmod +x $HOME/.nvm/nvm.sh
RUN . $HOME/.nvm/nvm.sh && nvm install $NODE_VERSION && nvm alias default $NODE_VERSION && nvm use default && npm install -g npm

RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/nodejs
RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/node /usr/bin/node
RUN ln -sf /root/.nvm/versions/node/v$NODE_VERSION/bin/npm /usr/bin/npm
3
Corey Cole

私が見つけたnvmをインストールする最もクリーンな方法は次のとおりです。

Shell ["/bin/bash", "--login", "-c"]

RUN curl -sL https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
RUN nvm install 10.15.3 && nvm use 10.15.3

説明

  • 最初の行は、Dockerfileのデフォルトシェルをbashログインシェルに設定します。注:これは、後続のすべてのRUNCMD、およびENTRYPOINTが現在のユーザー(通常はルート)の下で実行され、〜/をソースとすることを意味します。 シェル形式 で実行する場合、bashrcファイル。

  • 2行目はnvmをbashとともにインストールします。スクリプトをbashで実行すると、〜/ .bashrcファイルに追加されます。

  • 3行目は、特定のバージョンのnodejsをインストールして使用します。 nvmnpm、およびnodeコマンドは、bashログインシェルを介して実行されるため使用可能です(1行目を参照)。

0