2017-02-14 70 views
5

我想在我的容器啓動時設置一些配置,因爲我使用的是shell腳本。但是當我的腳本結束時,我的容器就會退出,我嘗試使用-d標誌/分離模式,但它永遠不會以分離模式運行。Dockerfile CMD指令將在運行後立即退出容器

下面是我Dockerfile

FROM ubuntu:14.04 

ADD shell.sh /usr/local/bin/shell.sh 

RUN chmod 777 /usr/local/bin/shell.sh 

CMD /usr/local/bin/shell.sh 

下面是我的shell腳本

#!/bin/bash 
echo Hello-docker 
  1. 運行沒有任何標誌

    docker run hello-docker 
    

    這將打印 '你好,泊塢窗' 上我的控制檯並退出

  2. 與-itd標誌

    docker run -itd hello-docker 
    

    和下面我的控制檯輸出,這一次也將很快退出運行。 :( enter image description here

    • 我看到的區別是在命令部分,當我運行的其他圖像命令部分會顯示「/斌/慶典」,並將繼續在分離模式。

    • 當我跑我的形象與shell腳本命令部分容器將顯示「/ bin/sh的-c在/ usr /失水」,並退出。

    • 我想運行容器,直到我不能手動停止。

編輯:

在Dockerfile添加入口點指令後,這將不執行我的shell腳本:(

FROM ubuntu:14.04 

ADD shell.sh /usr/local/bin/shell.sh 

RUN chmod 777 /usr/local/bin/shell.sh 

CMD /usr/local/bin/shell.sh 

ENTRYPOINT /bin/bash 

按搬運工文檔here

運行具有替代參數的容器時,CMD將被覆蓋,所以如果我運行docker映像並帶有如下的一些參數,將不會執行CMD指令。 :(

sudo docker run -it --entrypoint=/bin/bash <imagename> 

回答

3

最後有一些實驗我得到了我最好的結果如下

有什麼錯我Dockerfile如下它是正確的。

FROM ubuntu:14.04 

ADD shell.sh /usr/local/bin/shell.sh 

RUN chmod 777 /usr/local/bin/shell.sh 

CMD /usr/local/bin/shell.sh 

我做些什麼,以獲得預期的結果是,我只是在我的shell腳本文件中添加一個多個命令(如/ bin/bash)的下面和足底一切都在我的最好的方式工作。

#!/bin/bash 

echo 「Hello-docker」 > /usr/hello.txt 

/bin/bash 
4

泊塢窗容器將只要從你的Dockerfile的CMD需要運行。

在你的情況你CMD由包含一個單一的回聲shell腳本的。所以,容器將在完成後退出回聲。

您可以覆蓋CMD,例如:

sudo docker run -it --entrypoint=/bin/bash <imagename> 

這將在你的容器啓動一個交互的shell,而不是執行你的CMD。一旦你退出殼體,你的容器就會退出。

如果您希望容器保持活動狀態,則必須確保CMD能夠持續運行。例如,通過將while true; do sleep 1; done行添加到shell.sh文件中,您的容器將打印您的hello消息,然後不再執行任何操作,直到您停止它爲止(在另一個終端中使用docker stop)。

您可以使用docker exec -it <containername> bash在正在運行的容器中打開一個外殼。如果你執行命令ps ax,它會告訴你你的shell.sh仍然在容器中運行。

+0

但是這不會執行CMD指令,我的shell腳本不會執行。 :( –

+0

這是正確的,你不能同時擁有這兩個,唯一的另外一個選擇是讓你的'CMD'繼續運行,我在我的答案中加了一個例子 – NZD

+0

但是我也想執行我的腳本, –

5

您還可以修改你的第一個Dockerfile,更換

CMD /usr/local/bin/shell.sh

通過

CMD /usr/local/bin/shell.sh ; sleep infinity

這樣一來,你的腳本不會終止,而且您容器保持運行。

+0

這會起作用,但在此之後如果我附加容器並且想要檢查某些事情,它將不會響應。如果執行ls -l命令什麼都不會發生 –

+0

而不是附加,你可以'docker exec container_id__or_name ls -l' – user2915097

+0

但是我仍然覺得有更多的連擊方式來代替使用;睡眠無限。 –