2015-09-22 26 views
7

/root/.profileで定義されているbash関数nvmがあります。 docker build私はRUNのステップでそれを呼び出すと、その関数を見つけることができませんでした。Dockerfileでbash関数を実行する方法

RUN apt-get install -y curl build-essential libssl-dev && \ 
    curl https://raw.githubusercontent.com/creationix/nvm/v0.16.1/install.sh | sh 
RUN nvm install 0.12 && \ 
    nvm alias default 0.12 && \ 
    nvm use 0.12 

エラーが

Step 5 : RUN nvm install 0.12 
---> Running in b639c2bf60c0 
/bin/sh: nvm: command not found 

私は/root/.profileをロードする、bash -icでそれをラップすることにより、nvmを呼び出すことに成功しています。

RUN bash -ic "nvm install 0.12" && \ 
    bash -ic "nvm alias default 0.12" && \ 
    bash -ic "nvm use 0.12" 

上記の方法がうまく動作しますが、それは警告

bash: cannot set terminal process group (1): Inappropriate ioctl for device 
bash: no job control in this shell 

を持っており、私が知りたいのは、それが通常のバイナリだとしてbash -icせずに直接bashの関数を呼び出すための簡単かつクリーンな方法がありますラッピング?たぶん

RUN load_functions && \ 
    nvm install 0.12 && \ 
    nvm alias default 0.12 && \ 
    nvm use 0.12 
+0

'RUNのはbash -c「NVMは0.12''トリックを行う必要が0.12 && NVMエイリアスデフォルト0.12 && NVMの使用をインストールします。それはあなたのために働くのですか? (あなたのコンテナがどのように詳細に見えているかわからないので、私は100%確信していません) – hek2mgl

+0

うまくいきます。しかし、私はより良い解決策を探しています。 – Quanlong

+0

私の答えを確認してください。シェルスクリプトは、シェルスクリプトを実行する最もクリーンな方法です。 – hek2mgl

答えて

4

ドッカーのRUNのようなものは、シェルのコマンドを起動しません。シェル関数とシェル構文(cmd1 & & cmd2など)をそのまま使用することはできません。

RUN bash -c 'nvm install 0.12 && nvm alias default 0.12 && nvm use 0.12' 

あなたはその長いコマンドラインを恐れている場合は、シェルスクリプトにこれらのコマンドを入れて、RUNでスクリプトを呼び出す:あなたは、明示的にシェルを呼び出す必要が

script.sh

#!/bin/bash 

nvm install 0.12 && \ 
nvm alias default 0.12 && \ 
nvm use 0.12 

とそれを実行可能にします。

chmod +x script.sh 
Dockerfileで

は入れ:

RUN /path/to/script.sh 
+0

いくつかの異なるステップでnvmを実行する必要があります。そして、私は 'bash -c'の正しい見積もりは、コマンドが複数の行としてフォーマットされているときは制御が難しいと考えています。 – Quanlong

+0

だからこそ私はシェルスクリプトを使うことを提案した。 – hek2mgl

+0

なぜ私は複数のスクリプトが必要かわかりません。あなたはそれについて詳述できますか?私がそれを得たら、私は何かを提案するかもしれません。 – hek2mgl

関連する問題