2017-02-06 25 views
3

Dockerfileにnvmをインストールしようとしています。 OKをインストールするようですが、nvmコマンドが機能していません。Dockerfileにnvmをインストールするには?

Dockerfile:

# Install nvm 
RUN git clone http://github.com/creationix/nvm.git /root/.nvm; 
RUN chmod -R 777 /root/.nvm/; 
RUN sh /root/.nvm/install.sh; 
RUN export NVM_DIR="$HOME/.nvm"; 
RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc; 
RUN nvm ls-remote; 

ビルド出力:

Step 23/39 : RUN git clone http://github.com/creationix/nvm.git /root/.nvm; 
---> Running in ca485a68b9aa 
Cloning into '/root/.nvm'... 
---> a6f61d486443 
Removing intermediate container ca485a68b9aa 
Step 24/39 : RUN chmod -R 777 /root/.nvm/ 
---> Running in 6d4432926745 
---> 30e7efc5bd41 
Removing intermediate container 6d4432926745 
Step 25/39 : RUN sh /root/.nvm/install.sh; 
---> Running in 79b517430285 
=> Downloading nvm from git to '$HOME/.nvm' 
=> Cloning into '$HOME/.nvm'... 
* (HEAD detached at v0.33.0) 
    master 
=> Compressing and cleaning up git repository 

=> Appending nvm source string to /root/.profile 
=> bash_completion source string already in /root/.profile 
npm info it worked if it ends with ok 
npm info using [email protected] 
npm info using [email protected] 
npm info ok 
=> Installing Node.js version 6.9.5 
Downloading and installing node v6.9.5... 
Downloading https://nodejs.org/dist/v6.9.5/node-v6.9.5-linux-x64.tar.xz... 
######################################################################## 100.0% 
Computing checksum with sha256sum 
Checksums matched! 
Now using node v6.9.5 (npm v3.10.10) 
Creating default alias: default -> 6.9.5 (-> v6.9.5 *) 
/root/.nvm/install.sh: 136: [: v6.9.5: unexpected operator 
Failed to install Node.js 6.9.5 
=> Close and reopen your terminal to start using nvm or run the following to use it now: 

export NVM_DIR="$HOME/.nvm" 
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 
---> 9f6f3e74cd19 
Removing intermediate container 79b517430285 
Step 26/39 : RUN export NVM_DIR="$HOME/.nvm"; 
---> Running in 1d768138e3d5 
---> 8039dfb4311c 
Removing intermediate container 1d768138e3d5 
Step 27/39 : RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc; 
---> Running in d91126b7de62 
---> 52313e09866e 
Removing intermediate container d91126b7de62 
Step 28/39 : RUN nvm ls-remote; 
---> Running in f13c1ed42b3a 
/bin/sh: 1: nvm: not found 
The command '/bin/sh -c nvm ls-remote;' returned a non-zero code: 127 

エラー:

Step 28/39 : RUN nvm ls-remote; 
---> Running in f13c1ed42b3a 
/bin/sh: 1: nvm: not found 
The command '/bin/sh -c nvm ls-remote;' returned a non-zero code: 127 

私/root/.bashrcファイルの最後には、次のようになります。

[[ -s /root/.nvm/nvm.sh ]] && . /root/.nvm/nvm.sh 

Dockerfileの他のすべてが機能します。 nvmのものを追加することはそれを壊したものです。 Here is the full file.

+0

まずエラーポイント[ 'install.sh'のライン136](https://github.com/creationix/nvm/blob/master/install.sh#にL136)には奇妙なネストされた二重引用符があります。私はバッシュエキスパートではありませんが、それは私に間違って見える – Phil

+2

私たちは再現して助けることができるように、作業Dockerfile(可能であればあなたのベースイメージを含む)を与えることも自由に感じてください。 – kytwb

+0

@kytwb - 完全なDockerfile http://pastebin.com/f6YhKmQ2 – CR47

答えて

4

私はそれを動作させるためにあなたのDockerfileに次の変更を加えた:

まず、交換してください...

RUN sh /root/.nvm/install.sh; 

...と:

RUN bash /root/.nvm/install.sh; 

なぜ? Redhatベースのシステムでは、/bin/sh/bin/bashへのシンボリックリンクです。しかし、Ubuntuには、/bin/sh/bin/dashへのシンボリックリンクです。で... ...

[email protected]:/# bash -c '[ 1 == 1 ] && echo yes!' 
yes! 
[email protected]:/# dash -c '[ 1 == 1 ] && echo yes!' 
dash: 1: [: 1: unexpected operator 

第二に、交換してください

RUN nvm ls-remote; 

RUN bash -i -c 'nvm ls-remote'; 

なぜ、これがdashと何が起こりますか?ので、(ほとんど上部)のUbuntuでのユーザーのデフォルトの.bashrcには含まれています

# If not running interactively, don't do anything 
[ -z "$PS1" ] && return 

そしてNVMのスクリプトのソース-ingが一番下に行われます。だから、引数が-iで渡されてbashが対話的に呼び出されるようにする必要があります。

RUN export NVM_DIR="$HOME/.nvm"; 
RUN echo "[[ -s $HOME/.nvm/nvm.sh ]] && . $HOME/.nvm/nvm.sh" >> $HOME/.bashrc; 

理由:

第三に、あなたはあなたのDockerfileに次の行をスキップするだろうか? bash /root/.nvm/install.sh;ので、自動的にあなたのためにそれを行います。

[[email protected] ~]$ sudo docker run --rm -it 2a283d6e2173 tail -2 /root/.bashrc 
export NVM_DIR="$HOME/.nvm" 
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm 
関連する問題