解读三组容易混淆的Dockerfile指令
長話短說,今天分享三組容易混淆的Dockerfile指令, 幫助大家編寫更優雅的Dockfile文件、構建更純凈的Docker鏡像。
COPY ?vs ADD
COPY、ADD主體功能類似:從指定位置src拷貝文件到Docker鏡像dest。
COPY <src>... <dest> ADD <src>... <dest>COPY只允許從Docker Engine主機上拷貝文件到Docker鏡像文件;
ADD也能完成以上工作,但是ADD支持另外兩種src:
文件源可以是URL
可以從src直接解壓tar文件到目的地
有趣的是,URL下載和自動解壓功能不能同時生效:任何通過URL下載的壓縮包文件不會自動解壓。
如果拷貝本地文件到鏡像,通常使用COPY,因為含義更明確
ADD支持URL文件、自動解壓到指定目錄,這2個特性也很棒
ARG vs ENV
ARG、ENV也讓人很疑惑的,都是Dockerfile中定義變量的指令。ARG用于鏡像構建階段,ENV用于將來運行的容器。
生成鏡像后,ARG值不可用,正在運行的容器將無法訪問ARG變量值。
ENV主要是為容器環境變量提供默認值,正在運行的容器可訪問環境變量(這是將配置傳遞給應用的好方法):
一個小技巧:構建鏡像時不能使用命令行參數重寫ENV,但是你可以使用ARG動態為ENV設置默認值:
# You can set VAR_A while building the image or leave it at the default ARG VAR_A 5 # VAR_B gets the (overridden) value of VAR_A ENV VAR_B $VAR_ARUN ?vs ENTRYPOINT vs CMD
RUN 在新層中執行命令并產生新鏡像,主要用于安裝新軟件包。
ENTRYPOINT 執行程序的啟動命令,當您想將容器作為可執行文件運行時使用。
CMD和ENTRYPOINT 都可以提供程序的啟動命令;CMD另一個作用是為執行中的容器提供默認值
CMD ["executable","param1","param2"] (可執行形式,最常見)
CMD command param1 param2 (腳本形式)
但是當容器以命令啟動,docker run -it <image> ?/bin/bash, CMD會被忽略,bash解析器將會運行:root@98e4bed87725:/#
CMD ["param1","param2"] (作為ENTRYPOINT指令默認值,此時必須提供ENTRYPOINT指令,且ENTRYPOINT也必須以Json Array形式)
打算構建一個可執行的且常駐的鏡像,最好選用ENTRYPOINT;
如果需要提供默認命令參數(可在容器運行時從命令行覆蓋),請選擇CMD。
Reference
https://www.ctl.io/developers/blog/post/dockerfile-add-vs-copy/
https://vsupalov.com/docker-arg-vs-env/
https://aboullaite.me/dockerfile-run-vs-cmd-vs-entrypoint/
前后端分離,如何在前端項目中動態插入后端API基地址?(in docker)
誰說docker-compose不能水平擴展容器、服務多實例?
基于docker-compose的Gitlab CI/CD實踐&排坑指南
實例解讀Docker Swarm
關注我們
更多干貨及潮流技術
請關注Dotnet Plus公眾號
▲
▲
“閱讀全文,體驗更佳”
總結
以上是生活随笔為你收集整理的解读三组容易混淆的Dockerfile指令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Azure 国际版与中国版服务列表对(2
- 下一篇: ASP.NET Core使用Nacos