2015-10-14 125 views
2

我有一個用Ruby構建的圖像。我能夠在圖像中運行Ruby命令,irbinstall gems通過運行時:在運行Docker時無法運行ruby命令

docker run -it jikkujose/apple 

我也能做到這一點,列出在容器中的文件:

docker run -it jikkujose/apple ls 

但是,當我嘗試運行Ruby命令,它失敗:

docker run -it jikkujose/apple ruby -e "puts 'Hello'" 

錯誤:

Error response from daemon: Cannot start container c888aa8d2c7510a672608744a69f00c5feda4509742d54ea2896b7ebce76c16d: [8] System error: exec: "ruby": executable file not found in $PATH 
+0

其可能的路徑設置不正確使用二進制'在/ usr/bin中/ ruby​​'的完整路徑或嘗試'/ bin/sh -c「/ usr/bin/ruby​​ -e」puts'Hello'「'請確保路徑正確。 – askb

回答

2

這可能是因爲ruby可執行文件不在運行容器進程的用戶的路徑中(即, root或用Dockerfile中的USER命令指定的用戶)。以下兩個選項可能會幫助您解決問題。

  1. 運行容器時指定ruby二進制文件的完整路徑。 docker run -it jikkujose/apple /usr/bin/ruby -e "puts 'Hello'"
  2. /usr/bin添加到Dockerfile中的路徑ENV PATH /usr/bin:$PATH我不是100%確定這是有效的,但Dockerfile中的ENV運算符應該將此環境變量添加到容器。來源docker.com

或者,您可以在Dockerfile中指定/usr/bin/ruby作爲ENTRYPOINT。那就是:ENTRYPOINT ["/usr/bin/ruby"]。然後,您可以運行docker run -it jikkujose/apple -e "puts 'Hello'"請注意,這會導致容器默認運行/ usr/bin/ruby​​,並且如果要運行ls或其他命令,則需要覆蓋此入口點。

編輯:

最小可行的解決方案Dockerfile下面給出。讓我們假設/ usr/bin不在$ PATH環境變量中,它位於Ubuntu映像中。

FROM ubuntu:latest 

RUN apt-get install ruby -y 

ENV PATH /usr/bin:$PATH 

CMD ["bash"] 

運行docker run --rm -it pathtest ruby -e "puts 'Hello'"現在在終端輸出Hello

編輯2:

啊,你用Docker commit構建了鏡像。在運行docker run命令時,您可以發送環境變量。要做到這一點,只需運行搬運工像這樣:

docker run --rm -e "PATH=/usr/bin" -it pathtest ruby -e "puts 'Hello'" 

docker run -e選項允許您指定或覆蓋容器內的環境變量。請注意,您將不得不提供您希望$ PATH的所有路徑與此方法相同。

您可能還想簡單地編輯容器內的PATH變量,然後重新發送容器,以便/ container存儲在$ PATH環境變量中。

+0

謝謝,我只是試圖運行:'docker run -it jikkujose/apple whoami '並且得到'root'作爲響應;當我登錄到這個容器時是同一個用戶。看起來問題是'PATH'沒有得到婷集。如果我從命令行運行容器,我該如何忍受路徑設置? –

+0

在上面的答案中添加了最小可行的Dockerfile。 – Snorre

+0

添加了如何指定環境變量作爲docker run命令選項的示例。 – Snorre

1

其可能PATH設置不正確,因此嘗試

docker run -it jikkujose/apple /usr/bin/ruby -e "puts 'Hello'"

docker run -it jikkujose/apple /bin/sh -c "/usr/bin/ruby -e "puts 'Hello'"

+0

提供Ruby可執行文件的'PATH'確實有效。但是我想知道爲什麼'PATH'沒有被設置。奇怪的是,運行:docker run -it jikkujose/apple echo $ PATH'給出了我自己的機器的'PATH'變量而不是容器!爲什麼這樣? –

+0

有趣的是,當我登錄並回顯'PATH'變量時,我也明白了! –

+0

然後,如果在構建映像時PATH被覆蓋,您可能需要檢查dockerfile。接下來檢查基礎鏡像docker文件以確認。 – askb