1. 程式人生 > >Dockerfile編寫個人理解

Dockerfile編寫個人理解

開發十年,就只剩下這套架構體系了! >>>   

Dockerfile常用命令

(1) FROM: 製作image時依據的基本image
(2) RUN:製作image時執行的命令,一般在Dockerfile中多次出現
(3) CMD:啟動docker時執行的命令,在Dockerfile中只出現一次
(4) ENV:設定環境變數
(5) COPY:製作image時,將檔案系統中的檔案複製到Docker映象中
(6) WORKDIR:設定工作目錄
(7) EXPOSE:設定向外暴露的埠
(8) VOLUME:設定容器與外界對映的目錄
CMD三種語法:
CMD ["param1","param2"]   #提供給ENTRYPOINT預設引數。
CMD command param1 param2 #提供給需要互動的應用。
CMD ["executable","param1","param2"]#exec執行,這種格式會被解析為JSON陣列.因此必須雙引號,推薦使用

1.如果在Dockerfile中作為
CMD ["echo","b"] 會被解釋為:echo 為命令 b為引數物件。所以列印b
/bin/echo "b"
sh -c "/bin/echo "b""

2.如果在Dockerfile中
CMD ["echo_b"] 會將'echo_b'作為一個命令執行,而'echo b'本身不是一個命令所以會報錯。
/bin/echo_b
sh -c "/bin/echo_b"

3.如果在Dockerfile中
CMD ["sh", "-c","echo b","ef","echo c"]最終會解釋為: sh -c "echo b" "ef" "echo c" sh -c 只能接受一個命令所以無論後面接多少命令引數都無法解析執行。 所以結果為b 4.如果在Dockerfile中寫成以shell格式執行 CMD echo "b" "c" 最終正常shell:echo "b" "c"結果為b c CMD echo "b" "c" = sh -c "echo "b" "c"" 個人理解: CMD 命令 引數 #正常shell執行方式;想怎麼寫就怎麼寫-------簡單 CMD [命令,引數,引數] #第一個必須是命令實體如:CMD ["echo b","echo c","c"]就會報錯。CMD ["echo","echo c","c"]結果為:echo c c------容易混淆 CMD ["sh","-c","命令","引數","引數"]#最終會被解釋為:sh -c "命令",後面的再多的引數都不會被執行。 如果可以一條命令解決問題:那麼可以選擇exec方式如:CMD["sh","-c","cat /etc/passwd;echo b"]這種方式也是官方推薦的。--------簡單 CMD:執行容器時後接的命令會覆蓋掉構建映象時CMD命令。且以CMD ["sh","-c","命令"]執行 ENTRYPOINT:執行容器時後接的命令不會覆蓋掉ENTRYPOINT,而是會將該命令作為ENTRYPOINT的引數被執行。