Docker:Dockerfile的 CMD 與 ENTRYPOINT 命令區別


CMD指令和ENTRYPOINT指令的作用都是為鏡像指定容器啟動后的命令。

CMD

支持三種格式

    CMD ["executable","param1","param2"]     使用 exec 執行,推薦方式;

    CMD command param1 param2         shell中執行 ( /bin/sh ),提供給需要交互的應用;

    CMD ["param1","param2"]            注: 當Dockerfile內有ENTRYPOINT命令時,CMD命令會變成參數追加到ENTRYPOINT命令后

指定啟動容器時執行的命令,每個 Dockerfile只能有一條 CMD 命令。如果指定了多條命令,只有最后一條會被執行

如果用戶啟動容器時候指定了運行的命令,則會覆蓋掉 CMD 指定的命令。

ENTRYPOINT

兩種格式:

    ENTRYPOINT ["executable", "param1", "param2"]  使用 exec 執行,推薦方式;

    ENTRYPOINT command param1 param2        shell中執行 ( /bin/sh )

配置容器啟動后執行的命令,並且不可被 docker run 提供的參數覆蓋

每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個時,只有最后一個起效。

差異1

CMD指令指定的容器啟動時命令可以被docker run指定的命令覆蓋,

ENTRYPOINT指令指定的命令不能被覆蓋,而是將docker run指定的參數當做ENTRYPOINT指定命令的參數。

CMD 測試

容器啟動時指定命令是否會覆蓋CMD命令輸出。

Dockerfile

FROM ubuntu:14.04
MAINTAINER lienhua34@xxx.com

ADD startup /opt
RUN chmod a+x /opt/startup

CMD ["echo", "Hi"]

生成容器命令

docker run -ti --rm=true test /bin/bash -c 'echo Hello'

輸出結果 ( 會覆蓋CMD輸出結果 ) 

lienhua34@test$ sudo docker run -ti --rm=true test /bin/bash -c 'echo Hello' Hello

ENTRYPOINT 測試

容器啟動時指定命令是否會覆蓋ENTRYPOINT命令輸出。

Dockerfile

FROM ubuntu:14.04
MAINTAINER lienhua34@xxx.com

ADD startup /opt
RUN chmod a+x /opt/startup

ENTRYPOINT ["echo", "Hi"]

生成容器命令

docker run -ti --rm=true test /bin/bash -c 'echo Hello'

輸出結果 ( 不會覆蓋ENTRYPOINT輸出結果; 並且把運行時命令當作參數拼接到ENTRYPOINT命令之后

lienhua34@test$ sudo docker run -ti --rm=true test /bin/bash -c 'echo Hello' Hi /bin/bash -c echo Hello

差異2

CMD與ENTRYPOINT同時存在時CMD指令可以為ENTRYPOINT指令設置默認參數,而且CMD可以被docker run指定的參數覆蓋;

CMD設置參數測試

CMD與ENTRYPOINT同時存在時CMD指令可以為ENTRYPOINT指令設置默認參數

Dockerfile

FROM ubuntu:14.04
MAINTAINER lienhua34@xxx.com

ADD startup /opt
RUN chmod a+x /opt/startup

ENTRYPOINT ["echo", "Hi"]
CMD ["jack!"]

生成容器命令

docker run -ti --rm=true test

輸出結果 ( CMD為ENTRYPOINT設置參數生效 ) 

lienhua34@test$ sudo docker run -ti --rm=true test Hi jack!

 運行命令覆蓋測試

 CMD與ENTRYPOINT同時存在時CMD可以被docker run指定的參數覆蓋。

Dockerfile

FROM ubuntu:14.04
MAINTAINER lienhua34@xxx.com

ADD startup /opt
RUN chmod a+x /opt/startup

ENTRYPOINT ["echo", "Hi"]
CMD ["jack!"]

生成容器命令

docker run -ti --rm=true test Mark

輸出結果 ( 不會覆蓋ENTRYPOINT輸出結果; 並且把運行時命令當作參數拼接到ENTRYPOINT命令之后

lienhua34@test$ sudo docker run -ti --rm=true test Mark Hi Mark

 

 文章轉載至:https://blog.csdn.net/wuce_bai/article/details/88997725


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM