2016-09-27 430 views
0

我有一個關於從Dockerfile執行容器中的命令的查詢。Docker:爲什麼Dockerfile的命令沒有被執行?

#Dockerfile Content: 
    FROM ubuntu:14.04 
    MAINTAINER RAGHU 
    RUN echo "hello World" 

構建過程

docker build -t helloworld . 
Sending build context to Docker daemon 20.04 MB 
Step 1 : FROM ubuntu:14.04 
---> b1719e1db756 
Step 2 : MAINTAINER RAGHU 
---> Using cache 
---> 1704b62d66e2 
Step 3 : RUN echo "hello World" 
---> Running in 2b513872628e 
hello World 
---> ff559047fd19 
Removing intermediate container 2b513872628e 
Successfully built ff559047fd19 

問題1:爲什麼下面的執行並沒有導致任何結果?我期待打印「hello world」。發生了什麼問題?

[email protected]:/home/labadmin# docker run ff559047fd19 
[email protected]:/home/labadmin# docker ps -a 
CONTAINER ID IMAGE   COMMAND  CREATED  STATUS  PORTS   NAMES 
a8eede1874a2 ff559047fd19 "/bin/bash" 27 seconds ago Exited (0) 26 seconds ago tiny_williams 
[email protected]:/home/labadmin# docker logs a8eede1874a2 
#Above command has not resulted in any logs for this container. 

查詢2:我可以按以下方式運行執行步驟。爲什麼它在下面的容器中執行了命令,爲什麼不在運行容器a8eede1874a2時?

[email protected]:/home/labadmin# docker run -it ff559047fd19 
[email protected]:/# echo "hello world" 
hello world 
[email protected]:/# exit 
exit 
[email protected]:/home/labadmin/RAGHU/welcome-page# docker ps -a 
CONTAINER ID IMAGE COMMAND  CREATED   STATUS   PORTS NAMES 
486595ac9110 ff559047fd19 "/bin/bash" 22 seconds ago Exited (0) 7 seconds ago goofy_noyce 
a8eede1874a2 ff559047fd19 "/bin/bash" About a minute ago Exited (0)  About a minute ago tiny_williams 
[email protected]:/home/labadmin# docker logs 486595ac9110 
[email protected]:/# echo "hello world" 
hello world 
[email protected]:/# exit 
exit 
[email protected]:/home/labadmin/RAGHU/welcome-page# 

回答

2

問題1:

根據Dockerfile reference:本RUN指令將在當前圖像的頂部上的新的層執行任何命令和提交的結果。得到的拼接圖像將用於Dockerfile的下一步。

所以當你執行RUN echo "hello World"時,echo "hello World"會打印出一個「hello world」。並且執行結果以返回代碼0成功執行,已被添加到上一層的頂層。在你的情況下,前一層是MAINTAINER RAGHU的執行結果。

當您使用圖像創建容器ff559047fd19時,RUN echo "hello World"將不會再次執行,因爲此命令只會在圖像構建過程中執行。這是第3步:

Step 3 : RUN echo "hello World" 
---> Running in 2b513872628e 
hello World 

問題2:

你是創建你的形象ff559047fd19一個新的容器。因爲ff559047fd19基於Ubuntu,所以你可以附加到你的新容器的bash。

[email protected]:/# echo "hello world" 
hello world 

在這裏,您只需在新容器的bash中執行echo命令。

3

碼頭圖像使用(你猜對了!)碼頭容器逐層建立。要在運行容器時打印Hello World,您需要在Dockerfile中指定ENTRYPOINTCMD

從Dockerfile參考摘自:

注意:不要用CMD混淆RUN。 RUN實際上運行一個命令並提交結果; CMD在編譯時不執行任何操作,但指定了圖像的預期命令。

移動上快速定位到您查詢:

問題1:爲什麼下面的執行並沒有導致任何結果 ?我期待打印「hello world」。發生了什麼問題?

在你Dockerfile,當你說什麼RUN echo "hello world"碼頭工人實際上做的是它創建了一箇中間容器,執行該命令並保存容器的狀態,在其上會遇到下一個命令層。在您的例子中,你可以看到的「Hello World」實際上在步驟3

Step 3 : RUN echo "hello World" 
---> Running in 2b513872628e 
hello World 

併爲您的第二個查詢打印:

問題2:我能夠運行執行步驟如下。 爲什麼它在下面的容器中執行命令,爲什麼不運行容器a8eede1874a2時爲 ?

所以,當你用a8eede1874a2的散列創建容器時,你實際上做的是什麼......沒有。您尚未通過命令行指定CMD或ENTRYPOINT或命令。你的容器開始和停止,因爲沒有什麼可執行的。

現在在第二個示例中,您正在執行一個交互式shell,在其中運行echo "hello world"

例Dockerfile:

FROM ubuntu:14.04 
MAINTAINER RAGHU 
CMD "echo hello World" 

有用的引用: