2017-04-25 124 views
5

這是我在我的Dockerfile如何在Docker中正確安裝RVM?

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安裝。我該如何解決這個問題?

+0

問題:碼頭工人,容器內爲什麼要使用RVM?根據我的經驗,碼頭工人會使rvm過時。你爲每個你需要的ruby版本站起來一個新的容器。可能有些東西我錯過了,但我很想知道爲什麼你在Docker中使用rvm。 –

+0

好問題。這是一個通用Docker鏡像,許多項目都使用它。每個項目必須有能力使用自己的Ruby版本,只需要說'rvm install 2.1.0',而不需要創建自己的Docker鏡像。所有這些都發生在www.rultor.com項目中。 – yegor256

+0

有趣....在這種情況下,我會創建一個基礎圖像,其中包含您需要的所有內容,然後再選擇特定的ruby版本。從那裏創建額外的dockerfiles,從你的基礎鏡像中繼承'FROM'並安裝所需的特定ruby版本。沒有rvm需要。當然,我大大簡化了這種情況。在現實生活中可能並不那麼容易:) –

回答

8

長話短說:

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或任何其他初始化腳本。

我該如何解決這個問題?

如果你想總是有從rvmruby添加-l選項。

這裏是一個Dockerfile安裝rubyrvm

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]:/# 
+0

你可以請你說明我是如何更改我的'Dockerfile',以便每次運行'docker/bin/bash' Ruby版本是2.3.3? – yegor256

+0

我可以想象的唯一一件事就是在'ENTRYPOINT'選項(或者'CMD',或者將'CMD'指向一個執行初始化的shell腳本)中進行初始化,就像這樣''[[-s「/ path_to_rvm /.rvm/scripts/rvm「]] &&。「/path_to_rvm/.rvm/scripts/rvm」&&/bin/bash',這應該首先檢查rvm腳本,第二個'source'腳本並加載'bash' shell。 _注意關於'/ path_to_rvm'_! –

+0

如果您只是將您的Dockerfile版本發佈到您的答案中,將會很好,對其他人也很方便。謝謝! – yegor256