长话短说:
docker -it --rm myimage /bin/bash
命令不启动bash作为登录shell。
说明:
当你运行$ docker -it --rm myimage /bin/bash
它调用的bash没有-l
选项,使bash
行为就好像它被调用作为登录shell,rvm
初始化依赖于source
-ing /path/to/.rvm/scripts/rvm
或/etc/profile.d/rvm.sh
和初始化在.bash_profile
或.bashrc
或任何其他初始化脚本。
我该如何解决这个问题?
如果你想总是有从rvm
的ruby
添加-l
选项。
这里是一个Dockerfile安装ruby
由rvm
:
FROM debian
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update -q && \
apt-get install -qy 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
[email protected]:/# rvm -v
rvm 1.29.1 (master) by Michal Papis, Piotr Kuczynski, Wayne E. Seguin [https://rvm.io/]
[email protected]:/# ruby -v
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
[email protected]:/#
问题:码头工人,容器内为什么要使用RVM?根据我的经验,码头工人会使rvm过时。你为每个你需要的ruby版本站起来一个新的容器。可能有些东西我错过了,但我很想知道为什么你在Docker中使用rvm。 –
好问题。这是一个通用Docker镜像,许多项目都使用它。每个项目必须有能力使用自己的Ruby版本,只需要说'rvm install 2.1.0',而不需要创建自己的Docker镜像。所有这些都发生在www.rultor.com项目中。 – yegor256
有趣....在这种情况下,我会创建一个基础图像,其中包含您需要的所有内容,然后再选择特定的ruby版本。从那里创建额外的dockerfiles,从你的基础镜像中继承'FROM'并安装所需的特定ruby版本。没有rvm需要。当然,我大大简化了这种情况。在现实生活中可能并不那么容易:) –