web-dev-qa-db-ja.com

コンテナ内でbash -l -cを使用する必要があるのはなぜですか?

次のDockerfile(一部省略)を使用してDockerコンテナーを作成しました。

FROM ubuntu:12.04
# curl enables downloading of other things
RUN apt-get install curl -y
# download and install rvm...
RUN \curl -L https://get.rvm.io | bash -s stable
# ... so that we can install Ruby
RUN /bin/bash -l -c "rvm requirements"

等々。

これはすべて機能しますが、問題はパッケージのインストール方法/場所です。

docker run [...] rvmを使用してrvmを実行しただけでは「Unable to Locate rvm」が表示されますが、docker run [...] /bin/bash -l -c "rvm"を実行すると機能します。 (私は "-l -c"オプションをオンラインで見つけましたが、それらが何をしているのか分かりません、そして私がしていることの十分な説明が見つかりません!)

これはDockerの質問ではありません-それはbash/* nixの質問です-物がどのように/どこにインストールされるかについて何かがあると思います、おそらくルートの下でインストールを実行することに関連していますか?

ただ明確にするために-CLIから直接インストールしたものを実行できるようにしたいのです。

EDIT 1

Ruby rvmを使用してインストールすることをお勧めしますが、非インタラクティブ、非ログインシェル(つまり、Dockerコンテナー内)で実行する場合は、これにより、パス、環境変数、ログインスクリプトが実行されていません。

これを使用して、定義上分離されて回復可能なDockerコンテナーを実行している(別のコンテナーをビルドするだけ)とすると、バージョンの切り替えやパッケージの分離については特に気にしないので、インストールすることにしました= Ruby代わりにパッケージリポジトリ( http://brightbox.com/docs/Ruby/ubuntu/ )から。これは「うまくいく」だけです。

それはあなたのために機能しない可能性があります-私はProcfileを介してアプリを実行しているので、Foreman gemを取得するためにRubyをインストールしているだけなので、詳細についてはそれほど心配していません。 Rubyアプリを構築している場合、私は私の助言には従いません。

私のDockerfileはここにあります、FWIW https://index.docker.io/u/yunojuno/dev/

21

bash(1) から:

  • -lログインシェルとして呼び出されたかのようにbashを動作させる
  • -c -cオプションが存在する場合、コマンドは文字列から読み取られます。

-c引数に渡されたコマンドを実行しています。 -lはログインシェルにするため、bashは最初に/etc/profileを読み取ります。これはおそらくrvmへのパスを持つため、機能します。

FWIW、Dockerコンテナーにrvmをインストールする方法は次のとおりです。

# Install some dependencies
RUN apt-get -y -q install curl rubygems

# Install rvm
RUN curl -L https://get.rvm.io | bash -s stable

# Install package dependencies
RUN /usr/local/rvm/bin/rvm requirements

# Install Ruby
RUN /usr/local/rvm/bin/rvm install Ruby-2.0.0

# create first wrapper scripts
RUN /usr/local/rvm/bin/rvm wrapper Ruby-2.0.0 myapp rake Rails gem
31
Ben Whaley