【问题标题】:How to correctly install RVM in Docker?如何在 Docker 中正确安装 RVM?
【发布时间】:2017-04-25 14:04:06
【问题描述】:

这就是我的Dockerfile

RUN gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
RUN curl -L https://get.rvm.io | bash -s stable
RUN /bin/bash -l -c "rvm requirements"
RUN /bin/bash -l -c "rvm install 2.3.3"

工作得很好,但是,当我启动容器时,我看到了:

$ docker -it --rm myimage /bin/bash
/root# ruby --version
ruby 1.9.3p484 (2013-11-22 revision 43786) [x86_64-linux]
/root# /bin/bash -l -c "ruby --version"
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]

显然,这不是我想要的。据我了解,问题是bash 默认不运行/etc/profile。这就是为什么 Ruby 不是来自 RVM 安装的原因。我该如何解决?

【问题讨论】:

  • 你的问题:为什么在 docker 容器中使用 rvm?以我的经验,docker 使 rvm 过时了。你为你需要的每个 ruby​​ 版本建立一个新容器。不过,我可能缺少一些东西,我很想知道你为什么在 docker 中使用 rvm。
  • 好问题。这是一个通用的 Docker 镜像,被许多项目使用。每个项目都必须能够使用自己的 Ruby 版本,只需说 rvm install 2.1.0,而无需创建自己的 Docker 映像。这一切都发生在 www.rultor.com 项目中。
  • 有趣.... 在那种情况下,我会创建一个包含您需要的所有内容的基础映像,然后再选择特定的 ruby​​ 版本。从那里,创建额外的 dockerfiles 从你的基础镜像继承 FROM 并安装所需的特定 ruby​​ 版本。不需要 rvm。当然,我过于简单化了这种情况。在现实生活中可能没那么容易:)
  • 您的场景更符合 Docker 的精神,但我们的用户需要更多的步骤。现在,只需在.rultor.yml 中输入rvm install 2.1.0,您就拥有了Ruby 2.1.0。无需 Docker 知识。
  • 这当然是一个伟大的目标!我正在为另一个使用 Node.js v7 的项目做同样的事情 - 简化它,所以没有人需要知道任何关于 docker 的事情。

标签: ruby bash docker rvm


【解决方案1】:

长话短说:

docker -it --rm myimage /bin/bash 命令不会将 bash 作为登录 shell 启动。

解释:

当您运行$ docker -it --rm myimage /bin/bash 时,它会调用不带-l 选项的bash,这使得bash 的行为就像它已作为登录shell 调用一样,rvm 初始化取决于source-ing /path/to/.rvm/scripts/rvm/etc/profile.d/rvm.sh 并且该初始化位于 .bash_profile.bashrc 或任何其他初始化脚本中。

我该如何解决这个问题?

如果您不这样做,请始终使用来自rvmruby 添加-l 选项。

这是由rvm 安装的ruby 的Dockerfile:

FROM Debian

ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update -q && \
    apt-get install -qy procps curl ca-certificates gnupg2 build-essential --no-install-recommends && apt-get clean

RUN gpg2 --keyserver hkp://keys.gnupg.net --recv-keys D39DC0E3
RUN curl -sSL https://get.rvm.io | bash -s
RUN /bin/bash -l -c ". /etc/profile.d/rvm.sh && rvm install 2.3.3"
# The entry point here is an initialization process, 
# it will be used as arguments for e.g.
# `docker run` command 
ENTRYPOINT ["/bin/bash", "-l", "-c"]

运行容器:

➠ docker_templates : docker run -ti --rm rvm 'ruby -v'
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
➠ docker_templates : docker run -ti --rm rvm 'rvm -v'
rvm 1.29.1 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io/]
➠ docker_templates : docker run -ti --rm rvm bash
root@efa1bf7cec62:/# rvm -v
rvm 1.29.1 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io/]
root@efa1bf7cec62:/# ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
root@efa1bf7cec62:/# 

【讨论】:

  • 您能否说明我必须如何更改我的Dockerfile,以便每次运行docker /bin/bash Ruby 版本都是2.3.3?
  • 我能想象的唯一一件事是在ENTRYPOINT 选项中进行初始化(或CMD,或将CMD 指向一个执行初始化的小shell 脚本),就像这样@ 987654343@,这应该首先检查 rvm 脚本,然后是 source 该脚本并加载 bash shell。 注意/path_to_rvm
  • 如果您将Dockerfile 的版本发布到您的答案中会很棒,对其他人也很方便。谢谢!
  • 尝试通过rvm制作一个安装了ruby的容器,以确认我的答案。
  • @Зелёный 请考虑将 Alev 的答案标记为正确答案。更清楚了。
【解决方案2】:

不要使用RUN bash -l -c rvm install 2.3.3。这很邋遢。您可以通过SHELL [ "/bin/bash", "-l", "-c" ] 设置shell 命令并调用RUN rvm install 2.3.3

【讨论】:

  • 不错。此命令还解决了许多与“找不到命令”错误相关的未来问题。
猜你喜欢
  • 1970-01-01
  • 2017-04-23
  • 2012-08-19
  • 1970-01-01
  • 2015-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多