欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

dockerfile介紹與使用小結

 更新時間:2023年11月30日 10:29:33   作者:ZLOSER02  
Dockerfile是一個創(chuàng)建鏡像所有命令的文本文件, 包含了一條條指令和說明, 只需要在Dockerfile上添加或者修改指令, 就可生成 docker 鏡像,本文給大家介紹dockerfile介紹與使用小結,感興趣的朋友一起看看吧

文檔:https://docs.docker.com/engine/reference/builder/

dockerfile介紹

dockerfile是什么

Dockerfile是一個創(chuàng)建鏡像所有命令的文本文件, 包含了一條條指令和說明, 每條指令構建一層, 通過 docker build命令,根據Dockerfile的內容構建鏡像,因此每一條指令的內容, 就是描述該層如何構建.有了 Dockefile, 就可以制定自己的docker鏡像規(guī)則,只需要在Dockerfile上添加或者修改指令, 就可生成 docker 鏡像.

dockerfile解決了什么問題

Dockerfile 包含了鏡像制作的完整操作流程,其他開發(fā)者可以通過 Dockerfile 了解并復現制作過程 Dockerfile 中的每一條指令都會創(chuàng)建新的鏡像層,這些鏡像可以被 Docker Daemon 緩存。再次制作鏡 像時,Docker 會盡量復用緩存的鏡像層(using cache),而不是重新逐層構建,這樣可以節(jié)省時間和 磁盤空間 Dockerfile 的操作流程可以通過docker image history [鏡像名稱]查詢,方便開發(fā)者查看變更記錄

docker build 構建流程

docker build命令會讀取Dockerfile的內容,并將Dockerfile的內容發(fā)送給 Docker 引擎,最終 Docker 引擎會解析Dockerfile中的每一條指令,構建出需要的鏡像。
第一步,docker build會將 context 中的文件打包傳給 Docker daemon。如果 context 中 有.dockerignore文件,則會從上傳列表中刪除滿足.dockerignore規(guī)則的文件。注意:如果上下文中有相當多的文件,可以明顯感受到整個文件發(fā)送過程。
這里有個例外,如果.dockerignore文件中有.dockerignore或者Dockerfile,docker build命令在排除文件時會忽略掉這兩個文件。如果指定了鏡像的 tag,還會對 repository 和 tag 進行驗證。
第二步,docker build命令向 Docker server 發(fā)送 HTTP 請求,請求 Docker server 構建鏡像,請求中 包含了需要的 context 信息。
第三步,Docker server 接收到構建請求之后,會執(zhí)行以下流程來構建鏡像:
1. 創(chuàng)建一個臨時目錄,并將 context 中的文件解壓到該目錄下。
2. 讀取并解析 Dockerfile,遍歷其中的指令,根據命令類型分發(fā)到不同的模塊去執(zhí)行。
3. Docker 構建引擎為每一條指令創(chuàng)建一個臨時容器,在臨時容器中執(zhí)行指令,然后 commit 容器, 生成一個新的鏡像層。
4. 最后,將所有指令構建出的鏡像層合并,形成 build 的最后結果。最后一次 commit 生成的鏡像 ID 就是最終的鏡像 ID。

為了提高構建效率,docker build默認會緩存已有的鏡像層。如果構建鏡像時發(fā)現某個鏡像層已經被緩 存,就會直接使用該緩存鏡像,而不用重新構建。如果不希望使用緩存的鏡像,可以在執(zhí)行docker build命令時,指定--no-cache=true參數。

Docker 匹配緩存鏡像的規(guī)則為:遍歷緩存中的基礎鏡像及其子鏡像,檢查這些鏡像的構建指令是否和當 前指令完全一致,如果不一樣,則說明緩存不匹配。對于ADD、COPY指令,還會根據文件的校驗和 (checksum)來判斷添加到鏡像中的文件是否相同,如果不相同,則說明緩存不匹配。 這里要注意,緩存匹配檢查不會檢查容器中的文件。比如,當使用RUN apt-get -y update命令更新了容 器中的文件時,緩存策略并不會檢查這些文件,來判斷緩存是否匹配。 最后,可以通過docker history命令來查看鏡像的構建歷史。

關鍵字

FROM 設置鏡像使用的基礎鏡像
MAINTAINER 設置鏡像的作者
RUN 編譯鏡像時運行的腳步
CMD 設置容器的啟動命令
LABEL 設置鏡像標簽
EXPOSE 設置鏡像暴露的端口
ENV 設置容器的環(huán)境變量
ADD 編譯鏡像時復制上下文中文件到鏡像中
COPY 編譯鏡像時復制上下文中文件到鏡像中
ENTRYPOINT 設置容器的入口程序
VOLUME 設置容器的掛載卷
USER 設置運行 RUN CMD ENTRYPOINT的用戶名
WORKDIR 設置 RUN CMD ENTRYPOINT COPY ADD 指令的工作目錄
ARG 設置編譯鏡像時加入的參數
ONBUILD 設置鏡像的ONBUILD 指令
STOPSIGNAL 設置容器的退出信號量

dockerfile 實踐

基本語法實踐

mkdir example
cd example

vim Dockerfile

FROM golang
ENV env1=env1value
ENV env2=env2value
MAINTAINER zloser
# 僅指定鏡像元數據內容
LABEL hello 1.0.0
RUN git clone https://gitee.com/nickdemo/helloworld.git
WORKDIR helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]
docker build -t hello:1.0.0 -f Dockerfile .
docker run -p 80:80 -d --name hello hello:1.0.0

構建成功:

docker build上下文 

1. 素材準備

# 創(chuàng)建一個目錄,案例需要
mkdir example2
cd example2
# 下載nginx源碼包,作為案例素材
curl https://nginx.org/download/nginx-1.21.6.tar.gz > ./nginx-1.21.6.tar.gz
# 下載app代碼
git clone https://gitee.com/nickdemo/helloworld
# ./nginx*
# helloworld

 2. 沒有什么作用的上下文

FROM golang
ENV env1=env1value
ENV env2=env2value
MAINTAINER zloser
# 僅指定鏡像元數據內容
LABEL hello 1.0.0
RUN git clone https://gitee.com/nickdemo/helloworld.git
WORKDIR helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]
# 調整為不同的上下文,查看不同的效果
docker build -t hello:1.0.0 -f Dockerfile .

3. 上下文的真正作用

FROM golang:1.18
ENV env1=env1value
ENV env2=env2value
MAINTAINER zloser
LABEL hello 1.0.0
COPY ./helloworld /go/src/helloworld
WORKDIR /go/src/helloworld
RUN go env -w GOPROXY=https://proxy.golang.com.cn,https://goproxy.cn,direct
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o app .
EXPOSE 80
CMD ["./app","--param1=p1","--param2=p2"]
docker build -t hello:1.0.0 -f Dockerfile .

操作:
1. 嘗試在.dockerignore 文件中忽略不同的內容,觀察發(fā)送到守護進程的數據 
2. 嘗試 采用不同的上下文路徑來構建鏡像
3. 嘗試 copy上下文以外的內容來構建鏡像

多階段構建

Docker 17.05版本以后,新增了Dockerfile多階段構建。所謂多階段構建,實際上是允許一個Dockerfile 中出現多個 FROM 指令。這樣做有什么意義呢? 多個 FROM 指令的意義 多個 FROM 指令并不是為了生成多根的層關系,最后生成的鏡像,仍以最后一條 FROM 為準,之前的 FROM 會被拋棄,那么之前的FROM 又有什么意義呢? 每一條 FROM 指令都是一個構建階段,多條 FROM 就是多階段構建,雖然最后生成的鏡像只能是最后 一個階段的結果,但是,能夠將前置階段中的文件拷貝到后邊的階段中,這就是多階段構建的最大意義。 最大的使用場景是將編譯環(huán)境和運行環(huán)境分離,比如,之前我們需要構建一個Go語言程序,那么就需要用到go命令等編譯環(huán)境

ADD 與 COPY

1. ADD 與 COPY 不能拷貝上下文以外的文件
2. COPY 命令語法格式 

COPY <src> <dest> //將上下文中源文件,拷貝到目標文件
COPY prefix* /destDir/ //將所有prefix 開頭的文件拷貝到 destDir 目錄下
COPY prefix?.log /destDir/ //支持單個占位符,例如 : prefix1.log、prefix2.log 等

3. 對于目錄而言,COPY 和 ADD 命令具有相同的特點:只復制目錄中的內容而不包含目錄自身

COPY srcDir /destDir/ //只會將源文件夾srcDir下的文件拷貝到 destDir 目錄下

4. COPY 區(qū)別于ADD在于Dockerfile中使用multi-stage
5. ADD 命令語法

ADD <src> <dest>

ADD 命令除了不能用在 multistage 的場景下,ADD 命令可以完成 COPY 命令的所有功能,并且還可以 完成兩類的功能:
a.解壓壓縮文件并把它們添加到鏡像中,對于宿主機本地壓縮文件,ADD命令會自動解壓并添加到鏡像
b.從 url 拷貝文件到鏡像中,需要注意:url 所在文件如果是壓縮包,ADD 命令不會自動解壓縮

CMD 與 ENTRYPOINT

CMD
CMD 指令有三種格式

# shell 格式
CMD <command>
# exec格式,推薦格式
CMD ["executable","param1","param2"]
# 為ENTRYPOINT 指令提供參數
CMD ["param1","param2"]

1. CMD 指令提供容器運行時的默認值,這些默認值可以是一條指令,也可以是一些參數。
2. 一個dockerfile中可以有多條CMD指令,但只有最后一條CMD指令有效。
3. CMD參數格式是在CMD指令與ENTRYPOINT指令配合時使用,CMD指令中的參數會添加到 ENTRYPOINT指令中。
4. 使用shell 和exec 格式時,命令在容器中的運行方式與RUN 指令相同。不同在于,RUN指令在構建鏡像時執(zhí)行命令,并生成新的鏡像。
5. CMD指令在構建鏡像時并不執(zhí)行任何命令,而是在容器啟動時默認將CMD指令作為第一條執(zhí)行的命令。如果在命令行界面運行docker run 命令時指定命令參數,則會覆蓋CMD指令中的命令。

ENTRYPOINT
ENTRYPOINT指令有兩種格式 

# shell 格式
ENTRYPOINT <command>
# exec 格式,推薦格式
ENTRYPOINT ["executable","param1","param2"]

1. ENTRYPOINT指令和CMD指令類似,都可以讓容器每次啟動時執(zhí)行相同的命令,但它們之間又有不 同。一個Dockerfile中可以有多條ENTRYPOINT指令,但只有最后一條ENTRYPOINT指令有效。
2. 當使用shell格式時,ENTRYPOINT指令會忽略任何CMD指令和docker run 命令的參數,并且會運 行在bin/sh -c中。
3. 推薦使用exec格式,使用此格式,docker run 傳入的命令參數將會覆蓋CMD指令的內容并且附加 到ENTRYPOINT指令的參數中。
4. CMD可以是參數,也可以是指令,ENTRYPOINT只能是命令;docker run 命令提供的運行命令 參數可以覆蓋CMD,但不能覆蓋ENTRYPOINT。
5. 可以通過docker run --entrypoint 替換容器的入口程序

build arg

1. dockerfile 預定義參數:HTTP_PROXY,http_proxy,HTTPS_PROXY,https_proxy, FTP_PROXY,ftp_proxy,NO_PROXY,no_proxy,ALL_PROXY,all_proxy。預定義參數,可直 接在dockerfile中使用,無需使用arg來聲明
2.通過ARG自定義參數

FROM alpine:latest as s1
ARG wd label tag
RUN echo $wd,$label,$tag
ENV env1=env1value
ENV env2=env2value
MAINTAINER zloser
LABEL $label $tag
WORKDIR $wd
COPY --from=stage0 /go/src/helloworld/app ./
EXPOSE 80
ENTRYPOINT ["./app","--param1=p1","--param2=p2"]

target與cache-from

對于多階段構建,可以通過--target指定需要重新構建的階段。--cache-from 可以指定一個鏡像作為緩存源,當構建過程中dockerfile指令與緩存鏡像源指令匹配,則直接使用緩存鏡像中的鏡像層,從而加快構建進程??梢詫⒕彺骁R像推送到遠程注冊中心,提供給不同的構建過程使用,在使用前需要先pull到本地。

onbuild

onbuild指令將指令添加到鏡像中,當鏡像作為另一個構建的基礎鏡像時,將觸發(fā)這些指令執(zhí)行。觸發(fā)指 令將在下游構建的上下文中執(zhí)行。注意:onbuild指令不會影響當前構建,但會影響下游構建

到此這篇關于dockerfile介紹與使用小結的文章就介紹到這了,更多相關dockerfile介紹與使用內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • docker部署LNMP架構的方法

    docker部署LNMP架構的方法

    這篇文章主要介紹了docker部署LNMP架構的方法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-02-02
  • 解決docker容器中出現Access denied for user 'root'@'172.17.0.2'(using password: YES)問題

    解決docker容器中出現Access denied for user &apo

    這篇文章主要介紹了解決docker容器中出現Access denied for user 'root'@'172.17.0.2'(using password: YES)問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • docker-compose中的redis-stack詳解

    docker-compose中的redis-stack詳解

    Redis是一個開源的內存數據結構存儲系統(tǒng),主要用于數據庫、緩存和消息代理,支持多種數據結構,RedisStack則基于Redis,提供棧的操作及擴展功能,適合復雜數據處理,本文給大家介紹docker-compose中的redis-stack,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • Docker格式化輸出命令:"docker?inspect?--format"?學習記錄

    Docker格式化輸出命令:"docker?inspect?--format"?學習記錄

    Docker?--format?參數提供了基于?Go模板?的日志格式化輸出輔助功能,并提供了一些內置的增強函數,這篇文章主要介紹了Docker格式化輸出命令:"docker?inspect?--format"?學習筆記,需要的朋友可以參考下
    2023-01-01
  • docke自定義網絡之容器互聯(lián)

    docke自定義網絡之容器互聯(lián)

    大家好,本篇文章主要講的是docke自定義網絡之容器互聯(lián),感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Docker上部署FastApi的示例代碼

    Docker上部署FastApi的示例代碼

    本文主要介紹了Docker上部署FastApi的示例代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-03-03
  • Docker安裝配置Oracle詳細步驟記錄(以作持久化處理)

    Docker安裝配置Oracle詳細步驟記錄(以作持久化處理)

    docker是一個用Go語言實現的開源項目,可以讓我們方便的創(chuàng)建和使用容器,下面這篇文章主要給大家介紹了關于Docker安裝配置Oracle詳細步驟的相關資料,需要的朋友可以參考下
    2024-03-03
  • 創(chuàng)建Web項目的Docker鏡像實例講解

    創(chuàng)建Web項目的Docker鏡像實例講解

    這篇文章主要介紹了創(chuàng)建Web項目的Docker鏡像實例講解的相關資料,需要的朋友可以參考下
    2016-10-10
  • 詳解如何使用Docker快速部署ELK環(huán)境(最新5.5.1版本)

    詳解如何使用Docker快速部署ELK環(huán)境(最新5.5.1版本)

    這篇文章主要介紹了詳解如何使用Docker快速部署ELK環(huán)境(最新5.5.1版本),小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-08-08
  • docker run -e傳遞環(huán)境變量的過程

    docker run -e傳遞環(huán)境變量的過程

    這篇文章主要介紹了docker run -e傳遞環(huán)境變量的過程,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-01-01

最新評論