一尘不染

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

linux

我使用以下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"

等等。

所有这些都可以,但是我的问题是软件包的安装方式/位置。

如果我仅使用rvm运行rvm,则会显示docker run [...] rvm“无法找到rvm”,但是如果运行,docker run [...] /bin/bash -l -c "rvm"它会起作用。(我在网上找到了“ -l -c”选项,但不知道它们的作用,也找不到令人满意的解释!)

这不是一个docker问题-这是一个bash / * nix问题-我认为存在一些关于如何/在何处安装东西的问题,这可能与在root下运行安装有关?

明确说明-我希望能够直接从CLI运行我安装的内容。

编辑1

推荐使用rvm安装Ruby,但是,如果您想在非交互式,非登录外壳程序(例如,在docker容器内)中运行程序,这只会导致路径和环境变量以及登录脚本无法运行的麻烦。

鉴于我正在使用它来运行一个docker容器,根据定义,该容器是隔离的并且可以恢复(只需构建另一个容器),所以我实际上并不关心切换版本或隔离软件包,因此,我决定安装Ruby
而是从软件包仓库(http://brightbox.com/docs/ruby/ubuntu/)中获取。这“行之有效”。

它可能对您不起作用-我仅通过安装Ruby来获得Foreman
gem,因为我通过Procfile运行应用程序,因此我对细节不那么担心,我只需要它起作用即可。如果您要构建Ruby应用程序,则不会遵循我的建议。

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


阅读 1611

收藏
2020-06-07

共1个答案

一尘不染

来自bash(1)

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

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

FWIW,这是我要安装rvm在Docker容器中的操作。

# 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
2020-06-07