長話短說:
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需要。當然,我大大簡化了這種情況。在現實生活中可能並不那麼容易:) –