我使用以下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 run [...] rvm
docker run [...] /bin/bash -l -c "rvm"
这不是一个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/
来自bash(1):
bash(1)
-l
-c
您正在运行传递给-c参数的命令。-l使它成为登录shell,以便bash首先读取/etc/profile,它可能具有rvm使其工作的路径。
/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