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