2017-04-25 14 views
5

これは私が私のDockerfileに持っているものです。DockerにRVMを正しくインストールするには?

RUN gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 
RUN curl -L https://get.rvm.io | bash -s stable 
RUN /bin/bash -l -c "rvm requirements" 
RUN /bin/bash -l -c "rvm install 2.3.3" 

は正常に動作しますが、しかし、私はコンテナを起動したとき、私はこれを参照してください。もちろん

$ docker -it --rm myimage /bin/bash 
/root# ruby --version 
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux] 
/root# /bin/bash -l -c "ruby --version" 
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux] 

を、これは私が欲しいものではありません。私が理解する限り、問題はbashがデフォルトで/etc/profileを実行しないということです。だからRubyはRVMのインストールから来ていません。どうすれば修正できますか?

+0

質問:なぜドッキングウィンドウコンテナの内側にRVMを使うのか?私の経験ではdockerはrvmを廃止しました。あなたは必要なルビーバージョンごとに新しいコンテナを立ち上げます。私が行方不明になっているものがあります。なぜ、dockerでrvmを使用しているのか不思議です。 –

+0

良い質問です。これは、汎用のDocker画像で、多くのプロジェクトで使用されています。各プロジェクトは独自のDockerイメージを作成する必要なく、 'rvm install 2.1.0'と言うだけで独自のRubyバージョンを使用する能力が必要です。すべてこれはwww.rultor.comプロジェクトで行われます。 – yegor256

+0

興味深い....そのシナリオでは、私はあなたが特定のルビーバージョンを選択する前に必要なすべてを含むベースイメージを作成します。そこからベースイメージから 'FROM'を継承し、必要な特定のルビバージョンをインストールする追加のdockerfilesを作成します。 rvmは必要ありません。もちろん、私は状況を極端に単純化しています。実際の生活ではそれほど簡単ではないかもしれません:) –

答えて

8

かいつまん:

docker -it --rm myimage /bin/bashコマンドログインシェルとしてbashのを開始しません。

説明:

あなたが$ docker -it --rm myimage /bin/bashを実行すると、それは、それがログインシェルとして起動されたかのようbash行為を行う-lオプションなしでrvm初期化をbashのを起動するのですが/path/to/.rvm/scripts/rvmまたは/etc/profile.d/rvm.shとその初期化を-ing sourceに依存します.bash_profileまたは.bashrcまたは他の初期化スクリプトにあります。

どうすれば修正できますか?

あなたは常にrvmからruby-lオプションを追加していたい場合。ここで

rvmによってインストールさrubyとDockerfileです:

FROM debian 

ARG DEBIAN_FRONTEND=noninteractive 
RUN apt-get update -q && \ 
    apt-get install -qy curl ca-certificates gnupg2 build-essential --no-install-recommends && apt-get clean 

RUN gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3 
RUN curl -sSL https://get.rvm.io | bash -s 
RUN /bin/bash -l -c ". /etc/profile.d/rvm.sh && rvm install 2.3.3" 
# The entry point here is an initialization process, 
# it will be used as arguments for e.g. 
# `docker run` command 
ENTRYPOINT ["/bin/bash", "-l", "-c"] 

ランコンテナ:あなたのための

➠ docker_templates : docker run -ti --rm rvm 'ruby -v' 
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux] 
➠ docker_templates : docker run -ti --rm rvm 'rvm -v' 
rvm 1.29.1 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io/] 
➠ docker_templates : docker run -ti --rm rvm bash 
[email protected]:/# rvm -v 
rvm 1.29.1 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io/] 
[email protected]:/# ruby -v 
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux] 
[email protected]:/# 
+0

あなたは私が 'docker/bin/bash'を実行するたびにRubyのバージョンが2.3.3になるように正確に私が' Dockerfile'をどのように変更しなければならないかを教えてください。 – yegor256

+0

私が想像できる唯一のことは、 'ENTRYPOINT'オプション(または' CMD'、あるいは初期化を行う小さなシェルスクリプトを指す)を初期化することです。これは '[[-s"/path_to_rvm /.rvm/scripts/rvm "]] &&。"/path_to_rvm/.rvm/scripts/rvm" &&/bin/bash'、それは最初にrvmスクリプトをチェックし、2番目の 'source'はスクリプトを実行し、' bash'シェルをロードする必要があります。 _についての '/ path_to_rvm'_! –

+0

'Dockerfile'のあなたのバージョンをあなたの答えに投稿すれば他の人にも便利になるでしょう。ありがとう! – yegor256

関連する問題