Dockerfile 中 RUN, CMD, ENTRYPOINT 的區別

klvchen發表於2018-06-29
RUN 指令:用於指定 docker build 過程中要執行的命令。
    語法格式:
     RUN <command> 或
     RUN ["<executeable>","<param1>","param2",...]
     RUN ["/bin/bash","-c","<executeable>","param1","param2",...]
            
    例如:
        RUN yum install iproute nginx && yum clean all

CMD 指令:類似於 RUN 指令,用於執行程式,但二者執行的時間點不同;CMD 在docker run 時執行,而非docker build;
CMD 指令的首要目的在於為啟動的容器指定預設要執行的程式,程式執行結束,容器也就結束;注意: CMD 指令指定的程式可被 docker run 命令列引數中指定要執行的程式所覆蓋。
    語法格式:
    CMD <command> 或
    CMD ["<executeable>","<param1>","<param2>",...] 
    CMD ["<param1>","<param2>",...] 該寫法是為 ENTRYPOINT 指令指定的程式提供預設引數;
注意:如果 dockerfile 中如果存在多個CMD指令,僅最後一個生效;
        
    例如:     
            CMD ["/usr/sbin/httpd","-c","/etc/httpd/conf/httpd.conf"]

ENTRYPOINT 指令:類似於 CMD 指令,但其不會被 docker run 的命令列引數指定的指令所覆蓋,而且這些命令列引數會被當作引數送給 ENTRYPOINT 指令指定的程式;但是, 如果執行 docker run 時使用了 --entrypoint 選項,此選項的引數可當作要執行的程式覆蓋 ENTRYPOINT 指令指定的程式;
    語法格式:
    ENTRYPOINT <command> 或
    ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
            
    例如:
        CMD ["-c"]
        ENTRYPOINT ["top","-b"]

ENTRYPOINT 與 CMD 區別

如:
FROM ubuntu:14.10  
ENTRYPOINT ["top", "-b"]   
CMD ["-c"]  
    
把可能需要變動的引數寫到 CMD 裡面。然後你可以在 docker run 裡指定引數,這樣 CMD 裡的引數(這裡是-c) 就會被覆蓋掉而 ENTRYPOINT 裡的不被覆蓋。

注意:
ENTRYPOINT有兩種寫法,第二種(shell form)會遮蔽掉 docker run 時後面加的命令和 CMD 裡的引數。

相關文章