为什么我必须在我的容器中使用bash -l -c?

我已经使用以下Dockerfile(截断)创build了一个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运行rvm来docker run [...] rvm我会得到“Unable to locate rvm”,但是如果我运行docker docker run [...] /bin/bash -l -c "rvm"它将起作用。 (我在网上find了“-l -c”选项,但不知道他们在做什么,也找不到我正在做的令人满意的解释!)

这不是一个docker问题 – 这是一个bash / * nix的问题 – 我认为有什么东西/如何安装的东西,可能涉及到在根目录下运行安装?

只是要清楚 – 我想能够运行从CLI直接安装的东西。

编辑1

使用rvm安装Ruby是推荐的方法,但是如果你想在一个非交互的,非loginshell(即在一个docker容器内)中运行,这只会导致path和环境variables以及login脚本无法运行的麻烦。

鉴于我正在使用这个来运行一个docker容器,它的定义是隔离的,并且可以恢复(只是build立另外一个),我并不关心切换版本或隔离包,所以我决定安装Ruby从一个软件包回购( http://brightbox.com/docs/ruby/ubuntu/ )。 这个“正常工作”。

它可能不适合你 – 我只是安装Ruby来获得Foreman的gem,因为我通过一个Procfile运行一个应用程序,所以我没有那么细节的细节,我只是需要它的工作。 如果你正在构build一个Ruby应用程序,我不会听从我的build议。

我的Dockerfile在这里,FWIW, https: //index.docker.io/u/yunojuno/dev/

Solutions Collecting From Web of "为什么我必须在我的容器中使用bash -l -c?"

bash(1)

  • -l使bash的行为如同被调用为登录shell一样
  • -c如果存在-c选项,则从字符串中读取命令。

您正在运行传递给-c参数的命令。 -l使它成为一个登录shell,所以bash首先读取/etc/profile ,这可能有rvm的路径,这是它的工作原理。

FWIW,这是我做什么来安装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