1. 程式人生 > >Dockerfile指令(2):CMD

Dockerfile指令(2):CMD

docker映象以容器形式跑起來後,我們常常需要執行一些服務啟動命令。

1. 通過docker run指定容器啟動命令

我們知道,通過docker run建立並啟動一個容器時,命令的最後可以指定在容器啟動後,容器要立即執行的指令,如:

# docker run -i -t ubunu /bin/bash   //表示容器啟動時立即在容器內開啟一個shell終端

# docker run ubuntu /bin/ps    //表示容器啟動後立即執行/bin/ps命令,顯示容器的當前程序。

2. 通過dockerfile CMD指令指定容器啟動命令

除了這種方式外,我們可以在dockerfile檔案中通過CMD指令指定容器啟動時要執行的命令。如:

#test
FROM ubuntu

MAINTAINER xxx

RUN echo hello1 > test1.txt && echo hello2 > /test2.txt

EXPOSE 80
EXPOSE 81

CMD ["/bin/bash"]

上面dockerfile檔案中,最後一行CMD指令的引數是指定容器啟動時要執行的命令,這裡是bin/bash

3. 注意事項

  • docker run命令建立並啟動容器(myimage是用前面dockerfile建立的映象的名稱):
# docker run -i -t myimage  

上面命令是建立並啟動容器,開啟一個互動式shell。 而以前的寫法是docker run -i -t myimage /bin/bash

,這樣就省去了在docker run中的命令了。

  • 即使dockerfile中有CMD指令,我們仍然可以在docker run命令中帶上容器啟動時執行的命令,這會覆蓋dockerfile中的CMD指令指定的命令。
# docker run -i -t myimage /bin/ps

上面命令,因為/bin/ps覆蓋了CMD指令,啟動容器時會列印容器內的當前程序,但容器會立即停止,因為/bin/bash被覆蓋了,無法開啟互動式shell介面。

  • 注意,dockerfile中可以有多條cmd命令,但只是最後一條有效。

  • CMD命令的引數格式,一般寫成字串陣列的方式,如:

CMD  ["echo","hello world"
]

雖然也可寫成CMD echo hello word方式,但這樣docker會在指定的命令前加/bin/sh -c執行,有時可能會出問題,所以推薦採用資料結構的方式來存放命令。

4. 參考文章