日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

解读三组容易混淆的Dockerfile指令

發(fā)布時間:2023/12/4 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 解读三组容易混淆的Dockerfile指令 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

長話短說,今天分享三組容易混淆的Dockerfile指令, 幫助大家編寫更優(yōu)雅的Dockfile文件、構(gòu)建更純凈的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文件到目的地

  • ADD http://foo.com/bar.go /tmp/main.go # 從指定地址下載文件,添加到鏡像文件系統(tǒng)的/tmp/main.go位置ADD http://foo.com/bar.go /tmp/ # 因為以/結(jié)尾,將會引用url中的文件名添加到指定的目錄下ADD /foo.tar.gz /tmp/ # 自動解壓主機文件到指定目錄 “

    有趣的是,URL下載和自動解壓功能不能同時生效:任何通過URL下載的壓縮包文件不會自動解壓。

    • 如果拷貝本地文件到鏡像,通常使用COPY,因為含義更明確

    • ADD支持URL文件、自動解壓到指定目錄,這2個特性也很棒

    ARG vs ENV

    ARG、ENV也讓人很疑惑的,都是Dockerfile中定義變量的指令。ARG用于鏡像構(gòu)建階段,ENV用于將來運行的容器

    • 生成鏡像后,ARG值不可用,正在運行的容器將無法訪問ARG變量值。

    ARG VAR_NAME 5 # 構(gòu)建鏡像時,可提供--build-arg VAR_NAME=6 修改ARG值。
    • ENV主要是為容器環(huán)境變量提供默認(rèn)值,正在運行的容器可訪問環(huán)境變量(這是將配置傳遞給應(yīng)用的好方法):

    ENV VAR_NAME_2 6 # 啟動容器時,可通過docker run -e "VAR_NAME_2=7"或docker-compose.yml提供新的環(huán)境變量值來覆蓋Dockerfile中設(shè)置的ENV值。

    一個小技巧:構(gòu)建鏡像時不能使用命令行參數(shù)重寫ENV,但是你可以使用ARG動態(tài)為ENV設(shè)置默認(rèn)值:

    # 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_A

    RUN ?vs ENTRYPOINT vs CMD

  • RUN 在新層中執(zhí)行命令并產(chǎn)生新鏡像,主要用于安裝新軟件包。

  • ENTRYPOINT 執(zhí)行程序的啟動命令,當(dāng)您想將容器作為可執(zhí)行文件運行時使用。

  • CMD和ENTRYPOINT 都可以提供程序的啟動命令;CMD另一個作用是為執(zhí)行中的容器提供默認(rèn)值

    • CMD ["executable","param1","param2"] (可執(zhí)行形式,最常見)

    • CMD command param1 param2 (腳本形式)

    CMD echo "Hello world" # run -it <image> 輸出 Hello world “

    但是當(dāng)容器以命令啟動,docker run -it <image> ?/bin/bash, CMD會被忽略,bash解析器將會運行:root@98e4bed87725:/#

    • CMD ["param1","param2"] (作為ENTRYPOINT指令默認(rèn)值,此時必須提供ENTRYPOINT指令,且ENTRYPOINT也必須以Json Array形式)

    ENTRYPOINT ["/bin/echo", "Hello"] CMD ["world"]# run -it <image> 將會輸出 Hello world # run -it <image> earth 將會輸出 Hello earth

    打算構(gòu)建一個可執(zhí)行的且常駐的鏡像,最好選用ENTRYPOINT;
    如果需要提供默認(rèn)命令參數(shù)(可在容器運行時從命令行覆蓋),請選擇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/

    • 前后端分離,如何在前端項目中動態(tài)插入后端API基地址?(in docker)

    • 誰說docker-compose不能水平擴展容器、服務(wù)多實例?

    • 基于docker-compose的Gitlab CI/CD實踐&排坑指南

    • 實例解讀Docker Swarm

    關(guān)注我們
    更多干貨及潮流技術(shù)

    請關(guān)注Dotnet Plus公眾號

    “閱讀全文,體驗更佳”

    總結(jié)

    以上是生活随笔為你收集整理的解读三组容易混淆的Dockerfile指令的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。