本人實踐:
# 下面這種寫法會將變量值$MAIN_DLL當成字符串處理 ENTRYPOINT ["/usr/bin/dotnet","/app/$MAIN_DLL"] # 下面這種寫法會把"/usr/bin/dotnet","/app/$MAIN_DLL"分開執行,且變量值$MAIN_DLL結果為空 ENTRYPOINT ["sh", "-c","/usr/bin/dotnet","/app/$MAIN_DLL"] # 正確寫法1-多個腳本不使用環境變量:(結論:ENV環境變量只會在Shell腳本的首次執行起作用,多條腳本分開后面的命令會取不到環境變量) ENTRYPOINT ["/usr/bin/dotnet","/app/WebApplication.dll"] # 正確寫法2-單個腳本使用環境變量:(結論:ENV環境變量只會在Shell腳本的首次執行起作用,多條腳本分開后面的命令會取不到環境變量) ENTRYPOINT ["sh", "-c","/usr/bin/dotnet /app/${MAIN_DLL}"]
A-CMD,ENTRYPOINT命令區別
CMD: 啟動容器后,提供默認命令及參數 (不一定會執行,只是默認) 會docker run 后面參數替換 ENTRYPOINT: 啟動容器時執行(一定會執行)
/* 例如: Dockerfile 中: FROM centos //必須現有base鏡像,否則Error:No build stage in current context RUN touch ceshi_cmd //run創建新鏡像層,安裝軟件包 CMD echo "hello with cmd" ENTRYPOINT echo "hello with entrypoint" */ docker run -it this //運行 顯示 ENTRYPOINT的內容 // ENTRYPOINT一定會執行,沒有enrtypoint則會執行 cmd的內容 //cmd 作為默認選項 ,如果run it 帶參數,則cmd不會執行
B-CMD的使用
CMD 指令允許用戶指定容器的默認執行的命令。 三種格式: Excel: CMD ["executable","param1","param2"] ExceL參數:CMD ["param1","param2"] //用來為ENTRYPOINT 提供參數,此時entrypoint必須用Exce Shell: CMD command param1 param2
例: /* CMD echo "Hello world" // docker run -it [image] 輸出: Hello World // docker run -it [image] /bin/bash 此時會進入 /bin/bash命令,忽視cmd // docker run -it [image] “param" 加參數會出現錯誤 */
圖例:
C-ENTRYPOINT的使用:
ENTRYPOINT : Exec格式 用使用CMD的參數,run [image] 會替代CMD參數,會使用 run 中的多個參數 例: /* ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"] //表示默認參數,沒提供參數,則使用此參數 docker run -it [image] 輸出:Hello world docker run -it [image] "hanke" 輸出 Hello hanke ,不使用默認參數 docker run -it [image] "hanke" "hujing" 輸出 Hello hankd hujing 使用多個提供參數 */ Shell格式 :不會使用 CMD參數,run [image] 參數
圖例:
//entrypoint 使用參數
//entrypoint不使用cmd參數和[image]參數
shell和Exec格式
Shell格式Example: Exec格式Example: RUN apt-get install python3 RUN ["apt-get", "install", "python3"] CMD echo "Hello world" CMD ["/bin/echo", "Hello world"] ENTRYPOINT echo "Hello world" ENTRYPOINT ["/bin/echo", "Hello world"] Sheel格式中的命令會直接被sheel解析: 而Exec格式不會直接解析,需要加參數 例: ENV name Cloud Man ENTRYPOINT ["/bin/echo", "Hello, $name"] //輸出 Hello,Cloud Man ENV name Cloud Man ENTRYPOINT ["/bin/sh","echo Hello, $name"] //輸出 Hello,$name ["/bin/sh","-c","echo Hello, $name"] //輸出 /bin/sh:Hello,Cloud Man Command not found Warming: CMD 和 ENTRYPOINT 推薦使用 Exec 格式,因為指令可讀性更強,更容易理解 RUN 則兩種格式都可以。
感謝:https://blog.csdn.net/weixin_42971363/article/details/91506844