Docker筆記之Dockerfile

weixin_34391445發表於2018-12-20

Docker通過Dockerfile包含所有命令文字檔案中讀取指令來按照指令順序構建給定影象。Docker映象由只讀層組成,這些層都是堆疊的,也就是說每一層都是前一層變化的增量。也就是說通過Dockerfile文字檔案的指令,來建立每一層。

0. 一個簡單的Dockerfile使用

11227136-c1571710a188376c.png
docker build
先來說下docker build
docker build 根據Dockerfile檔案建立映象
命令格式:
    docker build [OPTIONS] PATH | URL | -
Options:
  --add-host           新增自定義主機到IP對映(主機:ip)
  --build-arg          設定構建時變數 
  --cache-from         要考慮作為快取源的影象  
  --cgroup-parent      容器的可選父cgroup  
  --compress           使用gzip壓縮構建上下文  
  --cpu-period        限制CPU CFS(完全公平計劃程式)期間  
  --cpu-quota        限制CPU CFS(完全公平計劃程式)配額 
  -c   --cpu-shares           CPU份額(相對權重) 
  --cpuset-cpus        允許執行的CPU(0-3,0,1) 
  --cpuset-mems        允許執行的MEM(0-3,0,1)  
  --disable-content-trust        跳過影象驗證  預設為true
  --file , -f        Dockerfile的名稱(預設為'PATH / Dockerfile') 
  --force-rm        始終移除中間容器 
  --iidfile        將影象ID寫入檔案 
  --isolation      容器隔離技術 
  --label        設定影象的後設資料 
   -m  --memory  記憶體限制 
   --memory-swap        交換限制等於記憶體加交換: - 1以啟用無限制交換 
   --network        在構建期間設定RUN指令的網路模式 
   --no-cache        構建映像時不要使用快取 
    --platform        如果伺服器具有多平臺功能,則設定平臺
   --progress        設定進度輸出型別(auto,plain,tty)。使用plain顯示容器輸出,預設為True
   --pull        始終嘗試拉出較新版本的影象 
   -q  --quiet         成功時禁止構建輸出並列印影象ID 
   --rm        成功構建後刪除中間容器,預設為True
   --secret         用於公開構建的祕密檔案(僅當啟用了BuildKit時):id = mysecret,src = / local / secret |
   --security-opt        安全選項 
   --shm-size        / dev / shm的大小  
   --squash        新構建的圖層壓縮到一個新圖層中  
   --ssh        SSH代理套接字或公開給構建的鍵(僅當啟用了BuildKit時)(格式:default |<id style="box-sizing: border-box;">[=<socket style="box-sizing: border-box;">|<key style="box-sizing: border-box;">[,<key style="box-sizing: border-box;">]])</key></key></socket></id> 
   --stream     Stream附加到伺服器以協商構建上下文  
   -t   --tag   以“name:tag”格式命名和選擇標記 
   --target  設定要構建的目標構建階段。  
   --ulimit   Ulimit選項 
然後說下構建映象的流程

先從FORM指定的映象(如果本地沒有,會自動從Docker Hub下載),建立一個容器,然後執行'RUN'指令後邊的內容,最後執行docker commit命令,將容器提交為映象,最後刪除過程中建立的容器。

11227136-b9d2ba53d62a8481.png
過程.png

接著來看
11227136-952097e3134afb55.png
不同的情況

通過圖片可以發現,

  • 第一次執行,跟預想的一樣。
  • 第二次執行docker build時,第二步沒有執行,顯示的時using cache,Dockerfile2檔案與第一次執行時的差異是在RUN echo "測試行"下一行新增了RUN echo "測試行下一行1;
  • 第三次執行docker build時,跟預想的一樣,Dockerfile2檔案與第二次執行時的差異是在RUN echo "測試行"上一行新增了RUN echo "測試行上一行";
    可以發現:當Dockerfile檔案需要增加指令時,儘量在末尾新增。如果在FROM下新增,會引起不必要的資源消耗。如果記憶體中存在執行過的指令,指令執行是從修改行開始的。

1. Dockerfile編寫命令:檢視詳細

FROM: 指定基礎映象
RUN: 構建映象過程中需要執行的命令。可以有多條。
CMD:新增啟動容器時需要執行的命令。多條只有最後一條生效。可以在啟動容器時被覆蓋和修改。
ENTRYPOINT:同CMD,但這個一定會被執行,不會被覆蓋修改。
LABEL :為映象新增對應的資料。
MLABELAINTAINER:表明映象的作者。將被遺棄,被LABEL代替。
EXPOSE:設定對外暴露的埠。
ENV:設定執行命令時的環境變數,並且在構建完成後,仍然生效
ARG:設定只在構建過程中使用的環境變數,構建完成後,將消失
ADD:將本地檔案或目錄拷貝到映象的檔案系統中。能解壓特定格式檔案,能將URL作為要拷貝的檔案
COPY:將本地檔案或目錄拷貝到映象的檔案系統中。
VOLUME:新增資料卷
USER:指定以哪個使用者的名義執行RUN, CMD 和ENTRYPOINT等命令
WORKDIR:設定工作目錄
ONBUILD:如果製作的映象被另一個Dockerfile使用,將在那裡被執行Docekrfile命令
STOPSIGNAL:設定容器退出時發出的關閉訊號。
HEALTHCHECK:設定容器狀態檢查。
SHELL:更改執行shell命令的程式。Linux的預設shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。
注:Dockerfile編寫還得多練!

相關文章