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

  • 本文关键字:bash-l-c linux bash shell docker
  • 更新时间 :
  • 英文 :


我使用以下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 located rvm",但如果我运行docker run [...] /bin/bash -l -c "rvm",它会起作用。(我在网上找到了"-l-c"选项,但不知道它们的作用,也找不到对我正在做的事情的满意解释!)

这不是一个docker问题-这是一个bash/*nix问题-我想有一些关于如何/在哪里安装的问题,可能与在root下运行安装有关?

需要明确的是,我希望能够直接从CLI运行我安装的东西。

编辑1

使用rvm安装Ruby是推荐的方法,但是,如果你想在非交互式、非登录的shell(即在docker容器中)中运行东西,这只会导致路径和环境变量以及登录脚本无法运行。

考虑到我正在使用它来运行一个docker容器,根据定义,它是隔离的和可恢复的(只需构建另一个),我真的不在乎切换版本或隔离包,所以我决定从包回购安装Ruby(http://brightbox.com/docs/ruby/ubuntu/)相反。这"很管用"。

它可能对你不起作用——我安装Ruby只是为了获得Foreman gem,因为我是通过Procfile运行应用程序的,所以我不太在意细节,我只需要它来工作。如果你正在构建一个Ruby应用程序,我不会听从我的建议。

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

来自bash(1):

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

您正在运行传递给-c参数的命令。-l使它成为一个登录shell,所以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

相关内容

  • 没有找到相关文章

最新更新