dockerにnvmをインストールするには?


101

私は新しい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にかなり慣れていないので、Dockerfileを作成するための基本的な要素が欠けている可能性がありますが、これまでのところ、すべての読み取りでは、良い解決策が示されていません。


11
これは
docker

ノードの単一バージョンのみをインストールするため、nvmをインストールする必要はないようです。Docker ノードリポジトリによって提供されるDockerfilesは、ノードをインストールする方法のリファレンスとして使用できます。
mikwat、

回答:


121

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

二回だけ変更で、それまでの速度にv0.20.0までv0.24.1
itsnikolay

8
nvm 0.31.0とノードv4.2.3のパスは/usr/local/nvm/versions/node/v4.2.3/bin
cwhsu

4
@thiagohこれは、質問者によるnvmのインストールが機能せず、有効な回答が機能する理由を説明していません。別のプロセスで実行されているシェルとは何の関係もありません。これは、質問がbash.rcをソースにして、nvmコマンドをbashにロードするnvm.shファイルをロードしようとしていますが、bash.rcが非対話的に実行されると早期に終了するため、nvmコマンドはロードされません。すべての成功した回答は、bash.rcを介して行うのではなく、直接nvm.shをソースします。これは、この作業を行うための鍵です。
tobuslieven 2017年

2
shをbashで置き換える代わりに. $NVM_DIR/nvm.sh、ソースバイナリを避けて、単にを実行できます。
Razvan Grigore 2017年

3
これは近いですが、パスは少し調整する必要があります:ENV NODE_PATH $ NVM_DIR / versions / node / v $ NODE_VERSION / lib / node_modules ENV PATH $ NVM_DIR / versions / node / v $ NODE_VERSION / bin:$ PATH
Lunulata

31

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"]

1
NODE_PATHはENV NODE_PATH $ NVM_DIR /バージョン/ノード/ V $ NODE_VERSION / libに/ node_modulesすべきではない
衆生

@Sentient様 私はこのdockerを運用環境(ubuntu)とローカル開発(OSX)で実行しています。どちらもエラーなしで適切に機能しています。古いNVMを実行している可能性がありますか?
danilodeveloper 2016

build-essentialとlibssl-devをインストールするSUDOを使用する必要がある理由はありますか?私はベテランのDevOpsではありません。
a.barbieri

1
キーはsource $NVM_DIR/nvm.sh && nvm install $NODE_VERSION
Vladimir Kornea

24

承認された回答以降、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-私はそうしましたが、それは私のベースイメージについて奇妙なことかもしれません。


1
ライフセーバー!3時間前にあなたの返事を見たとしたら。
エイドリアンマリニカ2017

私のために働いた、ベースイメージphp:7.1.1
Toby Mellor

18

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

よろしくお願いします。したがって、スクリプトを次のように変更しました: `FROM ubuntu MAINTAINER dficociello ADD files / nvm_install.sh / root /#Install nvm RUN [" / bin / bash "、" -c "、" rm -f / etc / nginx / nginx.conf && touch /root/.bashrc && apt-get update && apt-get install nginx curl -y && chmod a + x /root/nvm_install.sh && source /root/.bashrc && / root / nvm_install。 sh && nvm install 0.10.31 "] ADD files / nginx.conf / etc / nginx / EXPOSE 22`次のエラーが表示されます: `/ bin / bash:/root/nvm_install.sh:/ bin / bash:bad interpreter:テキストファイルビジー `
David Ficociello

このエラーはあなたの行にリンクされている必要がありますRUN ["/bin/bash", ...]。囲まれ[...]ていてはならず、インタプリタを指定する必要もありません/bin/bash -c
Kuhess 2014

17

これは上位の回答に基づいており、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


15

更新 20/02/2020:このソリューションは、debianベースイメージを使用している場合に機能します。を使用している場合はubuntuこの回答を参照してください。

ここにnvm私が見つけた最もクリーンなインストール方法があります:

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

RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
RUN nvm install 10.15.3

説明

  • 1行目は、Dockerfileのデフォルトシェルをbashログインシェルに設定します。注:この手段以降のすべてのことRUNCMDおよびENTRYPOINT現在のユーザー(通常はroot)の下で実行すると、ソースされます〜/ .bashrcのを実行する場合に、ファイルをシェル形

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

  • 3行目は、特定のバージョンのnodejsをインストールして使用します。nvmnpmnode彼らは、bashのログインシェル(ライン1を参照)を介して実行されるためのコマンドが用意されています。


1
どうもありがとうございます !
ガウイ

これがあなたのために働いていたことは興味深いです。私は似たようなものを試しましたが、ビルド中にすべてが問題なく見えましたが、結果のイメージを実行しようとしたときにNPMが見つかりませんでした。NVM_DIR他のいくつかの回答に示されているように、明示的に設定することで修正されました。
1

1
@esmailは、最初のRUNコマンドがで設定さNVM_DIRれるため、奇妙~/.bashrcです。
Dominic Roy-Stang

1
@ DominicRoy-Stang、有効なポイント。私が使用していた画像は使用するshため、無視され.bashrcます。また、コマンドを.bashrc実行する前に、本当にソースが供給されているのRUNでしょうか?私の公式bash画像での簡単なテストでは、そうではなかったようです。
esmail

1
@esmailは、最初の行(SHELL命令)がアドレスするものです。連続したRUNコマンドは、.bashrcファイルを供給するログインシェルを使用します。注:コマンドがシェルモードで実行されている場合にのみ機能します。RUN nvm --version。コマンドがexecモードで実行されている場合は機能しません。RUN ["nvm", "--version"]。シェルフォームに提供するリンクを更新して、これがより明確になることを願っています。
ドミニクロイスタング

10

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

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

8

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

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の回答を参考にしてください。


~/.nvm/nvm.shファイルを調達することが私が必要とした鍵でした。
2016年

これは、ubuntu 16.04.2コンテナで動作する唯一のソリューションでした。
drohm

7

まず、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;

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


うん-男-約100のソリューションを試してみましたが、あなたのソリューションだけが機能しました-10x
srfrnk

〜/ .nvm / nvm-tmp.shを使用するように修正して、ノードバージョンが〜/ .nvmディレクトリ内に正しくインストールされるようにする
guidoman

6

問題の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が非インタラクティブシェルでこの機能を実行しているとしても、私は驚かないでしょう。これは明示的に指摘されていなかったので、浮浪者と同じようなことをしているときに私が気づいたのはそれが理由だと言ったので、私はそれを言及したいと思いました。


問題の原因を見つけてくれてありがとう。ベースのubuntu 19.10イメージから/etc/skel/.bashrcファイルをコピーしてから、上記の問題のある行をコメント化しました。次に、私のDockerfileで、COPYコマンドを使用して「修正済み」の/etc/skel/.bashrcを/ etc / skelにコピーし、その後、RUNを使用して/ bin / bashをシェルとしてユーザーを作成しました。その後、RUN ["/ bin / bash"、 "-c"、 "-l"への後続の呼び出しは正常に機能しました。
ステファンDoliov

6

それを行うための最もクリーンな方法を理解するために私に1時間か2時間かかった。--loginは.bashrcを実行しないようなので、インタラクティブモードで起動するには-iを指定する必要があります。これにより、Dockerは少し怒鳴りつけるので、この方法でインストールを開始し、標準のシェルにリセットします。

# Installing Node
SHELL ["/bin/bash", "--login", "-i", "-c"]
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.2/install.sh | bash
RUN source /root/.bashrc && nvm install 12.14.1
SHELL ["/bin/bash", "--login", "-c"]

あなたの答えは私ubuntuがベースイメージとして使用して機能しないことを私に気づかせました(しかしあなたのものはそうです)。debianベースの画像を使用していました。2つの間の不一致の原因が何かはわかりません。何か案は?
Dominic Roy-Stang

基本画像としてubuntu 19:10を使用しています。関連するすべてのDockerの手順を掲載して、私にとって何が有効かを理解してもらいます。省略した指示は、関連性がないか、提供できません。コメントでそれらを表現します。文字制限の設定が低すぎるので、私は次のコメントでそれを投稿します
user2896438

4

これらはどれもうまく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

同意した。Dockerコンテナー(Debian GNU / Linux 9(stretch))にインストールする場合、nvm $HOME/.nvmも私にとっては終わりです。
Dave Stevens

はい、シンボリックリンクも私に追加する必要がありました。他の人がそれを必要としなかったのかと思っています。
PEZO

0

これは私のために働いたものです(私はdebianバスターを使用しています):

RUN apt-get update
RUN apt-get install -y build-essential checkinstall libssl-dev
RUN curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.35.1/install.sh | bash
SHELL ["/bin/bash", "--login", "-c"]

これでできるはずですnvm install <version>


0

答えは1つだけですが、curlのインストールを行いますが、Dockerfile全体が機能しません

ここに私のDockerfileがコピー/貼り付けの準備ができており、Ubuntu 18.04.3 LTSで最新のnvm 2020バージョンインストールします

FROM ubuntu

RUN apt-get update
RUN echo "y" | apt-get install curl
ENV NVM_DIR /usr/local/nvm
RUN mkdir -p /usr/local/nvm
RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
ENV NODE_VERSION v10
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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.