日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

目錄
  • 一、概述
  • 二、Dockerfile 結構
  • 三、常用 Dockerfile 操作指令
    • 1)鏡像構建(docker build)
    • 2)運行容器測試(docker run)
    • 3)ARG
    • 4)FROM
    • 5)MAINTAINER(已棄用)
    • 6)VOLUME
    • 7)RUN
    • 8)COPY
    • 9)ADD
    • 10)ENV
    • 11)WORKDIR
    • 12)USER
    • 13)EXPOSE
    • 14)CMD
    • 15)ENTRYPOINT
    • 16)HEALTHCHECK
    • 17)ONBUILD
    • 18)LABEL
  • 四、ARG 和 ENV 的區別
    • 五、CMD,ENTRYPOINT,command,args 場景測試
      • 1)command 和 args 不存在場景測試
      • 2)command 存在,但 args 存在場景測試
      • 3)command 不存在,但 args 存在場景測試
      • 4)command 和 args 都存在場景測試

    一、概述

    • Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。

    官方文檔:

    • https://docs.docker.com/engine/reference/builder/

    Dockerfile 示例:

    • https://github.com/dockerfile/

    Docker?鏡像構建保姆級入門示例教程

    二、Dockerfile 結構

    Dockerfile 結構主要分為四部分:

    • 基礎鏡像信息
    • 維護者信息
    • 鏡像操作指令
    • 容器啟動時執行指令 (CMD/ENTRYPOINT)
    • 【溫馨提示】Dockerfile 每行支持一條指令,每條指令可攜帶多個參數(支持&&),支持使用以“#“號開頭的注釋(jason 文件不支持#注釋),但是也非必須滿足上面的四點。

    三、常用 Dockerfile 操作指令

    • ARG—— 定義創建鏡像過程中使用的變量 ,唯一一個可以在 FROM 之前定義 。
    • FROM——基于某個鏡像, FROM前面只能有一個或多個ARG指令 。
    • MAINTAINER(已棄用) —— 鏡像維護者姓名或郵箱地址 。
    • VOLUME —— 指定容器掛載點到宿主機自動生成的目錄或其他容器
    • RUN——執行鏡像里的命令,跟在 liunx 執行命令一樣,只需要在前面加上 RUN 關鍵詞就行。
    • COPY——復制本地(宿主機)上的文件到鏡像。
    • ADD——復制并解壓(宿主機)上的壓縮文件到鏡像。
    • ENV——設置環境變量。
    • WORKDIR —— 為 RUN、CMD、ENTRYPOINT、COPY 和 ADD 設置工作目錄,就是切換目錄 。
    • USER —— 為 RUN、CMD、和 ENTRYPOINT 執行命令指定運行用戶。
    • EXPOSE —— 聲明容器的服務端口(僅僅是聲明) 。
    • CMD—— 容器啟動后執行的命令 ,多個 CMD 只會執行最后一個,跟 ENTRYPOINT 的區別是,CMD 可以作為 ENTRYPOINT 的參數,且會被 yaml 文件里的 command 覆蓋。
    • ENTRYPOINT—— 容器啟動后執行的命令 ,多個只會執行最后一個。
    • HEALTHCHECH —— 健康檢查 。
    • ONBUILD——它后面跟的是其它指令,比如 RUN, COPY 等,而這些指令,在當前鏡像構建時并不會被執行。只有當以當前鏡像為基礎鏡像,去構建下一級鏡像的時候才會被執行。
    • LABEL——LABEL 指令用來給鏡像添加一些元數據(metadata),以鍵值對的形式 ,替換 MAINTAINER。

    1)鏡像構建(docker build)

    docker build -t text:v1 . --no-cache
    # 要在構建后將映像標記到多個存儲庫中,請在運行命令-t時添加多個參數
    docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
    ### 參數解釋
    # -t:指定鏡像名稱
    # . :當前目錄Dockerfile
    # -f:指定Dockerfile路徑
    #  --no-cache:不緩存

    2)運行容器測試(docker run)

    # 非交互式運行
    docker run centos:7.4.1708 /bin/echo "Hello world"
    ### 交互式執行
    # -t: 在新容器內指定一個偽終端或終端。
    #-i: 允許你對容器內的標準輸入 (STDIN) 進行交互。
    # 會登錄到docker環境中,交互式
    docker run -it centos:7.4.1708 /bin/bash
    # -d:后臺執行,加了 -d 參數默認不會進入容器
    docker run -itd centos:7.4.1708 /bin/bash
    ### 進入容器
    # 在使用 -d 參數時,容器啟動后會進入后臺。此時想要進入容器,可以通過以下指令進入:
    #docker exec -it :推薦大家使用 docker exec -it 命令,因為此命令會退出容器終端,但不會導致容器的停止。
    #docker attach:容器退出,會導致容器的停止。
    docker exec -it  b2c0235dc53 /bin/bash
    docker attach  b2c0235dc53

    3)ARG

    • 構建參數,與 ENV 作用一致。不過作用域不一樣。ARG 設置的環境變量僅對 Dockerfile 內有效,也就是說只有 docker build 的過程中有效,構建好的鏡像內不存在此環境變量。唯一一個可以在 FROM 之前定義 。構建命令 docker build 中可以用 –build-arg <參數名>=<值> 來覆蓋。

    語法格式:

    ARG <參數名>[=<默認值>]

    示例:

    # 在FROM之前定義ARG,只在 FROM 中生效
    ARG VERSION=laster
    FROM centos:${VERSION}
    # 在FROM之后使用,得重新定義,不需要賦值
    ARG VERSION
    RUN echo $VERSION >/tmp/image_version

    4)FROM

    • 定制的鏡像都是基于 FROM 的鏡像 ,【必選項】

    語法格式:

    FROM [--platform=&lt;platform&gt;] &lt;image&gt; [AS &lt;name&gt;]
    FROM [--platform=&lt;platform&gt;] &lt;image&gt;[:&lt;tag&gt;] [AS &lt;name&gt;]
    FROM [--platform=&lt;platform&gt;] &lt;image&gt;[@&lt;digest&gt;] [AS &lt;name&gt;]
    • 如果引用多平臺圖像,可選–platform標志可用于指定圖像的平臺。FROM例如,linux/amd64、 linux/arm64或windows/amd64。默認情況下,使用構建請求的目標平臺。全局構建參數可用于此標志的值,例如允許您將階段強制為原生構建平臺 ( –platform=$BUILDPLATFORM),并使用它交叉編譯到階段內的目標平臺。

    示例:

    ARG VERSION=latest
    FROM busybox:$VERSION
    # FROM --platform="linux/amd64" busybox:$VERSION
    ARG VERSION
    RUN echo $VERSION > image_version

    5)MAINTAINER(已棄用)

    • 鏡像維護者信息

    語法格式:

    MAINTAINER <name>

    示例:

    LABEL org.opencontainers.image.authors="SvenDowideit@home.org.au"

    6)VOLUME

    • 定義匿名數據卷。在啟動容器時忘記掛載數據卷,會自動掛載到匿名卷。

    作用:

    • 避免重要的數據,因容器重啟而丟失,這是非常致命的。
    • 避免容器不斷變大。
    • 在啟動容器 docker run 的時候,我們可以通過 -v 參數修改掛載點。

    語法格式:

    # 后面路徑是容器內的路徑,對應宿主機的目錄是隨機的
    VOLUME ["<路徑1>", "<路徑2>"...]
    VOLUME <路徑>

    示例:

    FROM ubuntu
    RUN mkdir /myvol
    RUN echo "hello world" > /myvol/greeting
    VOLUME /myvol

    7)RUN

    • 用于執行后面跟著的命令行命令。

    語法格式:

    • RUN (shell形式,命令在 shell 中運行,默認/bin/sh -c在 Linux 或cmd /S /CWindows 上)
    • RUN ["executable", "param1", "param2"](執行形式)

    示例:

    # 以下三種寫法等價
    RUN /bin/bash -c 'source $HOME/.bashrc; \
    echo $HOME'
    RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME'
    RUN ["/bin/bash", "-c", "source $HOME/.bashrc; echo $HOME"]

    8)COPY

    • 拷貝(宿主機)文件或目錄到容器中,跟 ADD 類似,但不具備自動下載或解壓的功能 。所有新文件和目錄都使用 0 的 UID 和 GID 創建,除非可選–chown標志指定給定的用戶名、組名或 UID/GID 組合以請求復制內容的特定所有權。

    語法格式:

    COPY [--chown=<user>:<group>] <src>... <dest>
    COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]

    示例:

    # 添加所有以“hom”開頭的文件:
    COPY hom* /mydir/
    # ?替換為任何單個字符,例如“home.txt”。
    COPY hom?.txt /mydir/
    # 使用相對路徑,并將“test.txt”添加到<WORKDIR>/relativeDir/:
    COPY test.txt relativeDir/
    # 使用絕對路徑,并將“test.txt”添加到/absoluteDir/
    COPY test.txt /absoluteDir/
    # 修改文件權限
    COPY --chown=55:mygroup files* /somedir/
    COPY --chown=bin files* /somedir/
    COPY --chown=1 files* /somedir/
    COPY --chown=10:11 files* /somedir/

    9)ADD

    • 拷貝文件或目錄到容器中,如果是 URL 或壓縮包便會自動下載或自動解壓 。

    ADD 指令和 COPY 的使用格類似(同樣需求下,官方推薦使用 COPY)。功能也類似,不同之處如下:

    • ADD 的優點:在執行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下,會自動復制并解壓到 <目標路徑>。
    • ADD 的缺點:在不解壓的前提下,無法復制 tar 壓縮文件。會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢。具體是否使用,可以根據是否需要自動解壓來決定。

    語法格式:

    ADD [--chown=<user>:<group>] <src>... <dest>
    ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]

    示例:

    # 通配符
    ADD hom* /mydir/
    # 相對路徑,拷貝到WORKDIR目錄下relativeDir/
    ADD test.txt relativeDir/
    # 絕對路徑
    ADD test.txt /absoluteDir/
    # 更改權限
    ADD --chown=55:mygroup files* /somedir/
    ADD --chown=bin files* /somedir/
    ADD --chown=1 files* /somedir/
    ADD --chown=10:11 files* /somedir/

    ADD 和 COPY 的區別和使用場景:

    • ADD 支持添加遠程 url 和自動提取壓縮格式的文件,COPY 只允許從本機中復制文件
    • COPY 支持從其他構建階段中復制源文件(–from)
    • 根據官方 Dockerfile 最佳實踐,除非真的需要從遠程 url 添加文件或自動提取壓縮文件才用 ADD,其他情況一律使用 COPY

    10)ENV

    • 設置環境變量,定義了環境變量,那么在后續的指令中,就可以使用這個環境變量。

    語法格式:

    ENV <key1>=<value1> <key2>=<value2>...
    # 省略"="此語法不允許在單個ENV指令中設置多個環境變量,并且可能會造成混淆。
    ENV <key> <value>

    示例:

    ENV JAVA_HOME=/usr/local/jdk
    ENV MY_NAME="John Doe" MY_DOG=Rex\ The\ Dog \
       MY_CAT=fluffy
    # 此語法不允許在單個ENV指令中設置多個環境變量,并且可能會造成混淆。
    ENV JAVA_HOME /usr/local/jdk

    11)WORKDIR

    • 指定工作目錄。用 WORKDIR 指定的工作目錄,會在構建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄,必須是提前創建好的)。

    語法格式:

    WORKDIR <工作目錄路徑>

    示例:

    FROM busybox
    ENV FOO=/bar
    WORKDIR ${FOO}   # WORKDIR /bar

    12)USER

    • 用于指定執行后續命令的用戶和用戶組,這邊只是切換后續命令執行的用戶(用戶和用戶組必須提前已經存在)。

    語法格式:

    USER <用戶名>[:<用戶組>]
    USER <UID>[:<GID>]

    示例:

    FROM busybox
    RUN groupadd --system --gid=9999 admin && useradd --system --home-dir /home/admin --uid=9999 --gid=admin admin
    USER admin:admin
    # USER 9999:9999

    13)EXPOSE

    • 暴露端口 ,僅僅只是聲明端口。

    作用:

    • 幫助鏡像使用者理解這個鏡像服務的守護端口,以方便配置映射。
    • 在運行時使用隨機端口映射時,也就是 docker run -P 時,會自動隨機映射 EXPOSE 的端口。

    語法格式:

    # 默認情況下,EXPOSE假定 TCP。
    EXPOSE <port> [<port>/<protocol>...]

    示例:

    EXPOSE 80/TCP 443/TCP
    EXPOSE 80 443
    EXPOSE 80/tcp
    EXPOSE 80/udp

    14)CMD

    • 類似于 RUN 指令,用于運行程序,但二者運行的時間點不同:CMD 在構建鏡像時不會執行,在容器運行 時運行。

    語法格式:

    CMD <shell 命令>
    CMD ["<可執行文件或命令>","<param1>","<param2>",...]
    CMD ["<param1>","<param2>",...]  # 該寫法是為 ENTRYPOINT 指令指定的程序提供默認參數
    • 推薦使用第二種格式,執行過程比較明確。第一種格式實際上在運行的過程中也會自動轉換成第二種格式運行,并且默認可執行文件是 sh。

    示例:

    CMD cat /etc/profile
    CMD ["/bin/sh","-c","/etc/profile"]
    • 注意:如果 Dockerfile 中如果存在多個 CMD 指令,僅最后一個生效。

    15)ENTRYPOINT

    • 類似于 CMD 指令,但其不會被 docker run 的命令行參數指定的指令所覆蓋,而且這些命令行參數會被當作參數送給 ENTRYPOINT 指令指定的程序。但是, 如果運行 docker run 時使用了 –entrypoint 選項,將覆蓋 ENTRYPOINT 指令指定的程序。在 k8s 中 command 也會覆蓋 ENTRYPOINT 指令指定的程序

    語法格式:

    # exec形式,這是首選形式:
    ENTRYPOINT ["executable", "param1", "param2"]
    # 外殼形式:
    ENTRYPOINT command param1 param2

    示例:

    FROM ubuntu
    ENTRYPOINT ["top", "-b"]
    # CMD作為ENTRYPOINT參數
    CMD ["-c"]
    # 與下面的等價
    ENTRYPOINT ["top", "-b -c"]
    ENTRYPOINT  top -b -c
    • 注意:如果 Dockerfile 中如果存在多個 ENTRYPOINT 指令,僅最后一個生效。

    16)HEALTHCHECK

    • 用于指定某個程序或者指令來監控 docker 容器服務的運行狀態。

    語法格式:

    HEALTHCHECK [OPTIONS] CMD command(通過在容器內運行命令檢查容器運行狀況)
    HEALTHCHECK NONE(禁用從基礎映像繼承的任何運行狀況檢查)

    選項CMD有:

    • –interval=DURATION(默認30s:):間隔,頻率
    • –timeout=DURATION(默認30s:):超時時間
    • –start-period=DURATION(默認0s:):為需要時間引導的容器提供初始化時間, 在此期間探測失敗將不計入最大重試次數。
    • –retries=N(默認3:):重試次數

    命令的exit status指示容器的運行狀況。可能的值為:

    • 0:健康狀態,容器健康且已準備完成。
    • 1:不健康狀態,容器工作不正常。
    • 2:保留,不要使用此退出代碼。

    示例:

    FROM nginx
    MAINTAINER Securitit
    HEALTHCHECK --interval=5s --timeout=3s \
     CMD curl -f http://localhost/ || exit 1
    CMD ["usr/sbin/nginx", "-g", "daemon off;"]

    17)ONBUILD

    • ONBUILD 是一個特殊的指令,它后面跟的是其它指令,比如 RUN, COPY 等,而這些指令,在當前鏡像構建時并不會被執行。只有當以當前鏡像為基礎鏡像,去構建下一級鏡像的時候才會被執行。

    語法格式:

    ONBUILD <其它指令>

    示例:

    FROM node:slim
    RUN mkdir /app
    WORKDIR /app
    ONBUILD COPY ./package.json /app
    ONBUILD RUN [ "npm", "install" ]
    ONBUILD COPY . /app/
    CMD [ "npm", "start" ]

    18)LABEL

    • LABEL 指令用來給鏡像添加一些元數據(metadata),以鍵值對的形式。用來替代 MAINTAINER。

    語法格式:

    LABEL <key>=<value> <key>=<value> <key>=<value> ...

    示例:比如我們可以添加鏡像的作者

    LABEL org.opencontainers.image.authors="runoob"

    四、ARG 和 ENV 的區別

    • ARG 定義的變量只會存在于鏡像構建過程,啟動容器后并不保留這些變量
    • ENV 定義的變量在啟動容器后仍然保留

    五、CMD,ENTRYPOINT,command,args 場景測試

    當用戶同時在 kubernetes 中的 yaml 文件中寫了command和args的時候,默認是會覆蓋DockerFile中的命令行和參數,完整的情況分類如下:

    1)command 和 args 不存在場景測試

    • 如果 command 和 args 都沒有寫,那么用DockerFile默認的配置。
    Dockerfile
    FROM centos
    COPY test.sh /
    RUN chmod +x /test.sh
    ### ENTRYPOINT將作為的子命令啟動/bin/sh -c,它不會傳遞參數,要傳遞參數只能這樣傳參
    # ENTRYPOINT ["/bin/sh","-c","/test.sh ENTRYPOINT"]
    ENTRYPOINT ["/test.sh","ENTRYPOINT"]
    CMD ["CMD"]

    /tmp/test.sh

    #!/bin/bash
    echo $*

    構建

    docker build -t test1:v1 -f Dockerfile .

    yaml 編排

    cat << EOF > test1.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: test
    spec:
     replicas: 1
     selector:
       matchLabels:
         app: test
     template:
       metadata:
         labels:
           app: test
       spec:
         nodeName: local-168-182-110
         containers:
         - name: test
           image: test:v1
           #command: ['/bin/sh','-c','/test.sh']
           #args: ['args']
    EOF

    執行

    kubectl apply -f test.yaml

    2)command 存在,但 args 存在場景測試

    • 如果 command 寫了,但 args 沒有寫,那么 Docker 默認的配置會被忽略而且僅僅執行.yaml文件的 command(不帶任何參數的)。
    cat << EOF > test2.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: test2
    spec:
     replicas: 1
     selector:
       matchLabels:
         app: test2
     template:
       metadata:
         labels:
           app: test2
       spec:
         nodeName: local-168-182-110
         containers:
         - name: test2
           image: test:v1
           # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會輸出hello,只能通過這樣傳參,['/bin/sh','-c','/test.sh command'];CMD里面的參數會被忽略
           command: ['/test.sh']
           # command帶參數
           # command: ['/test.sh','command']
           #args: ['args']
    EOF

    3)command 不存在,但 args 存在場景測試

    • 如果 command 沒寫,但 args 寫了,那么 Docker 默認配置的 ENTRYPOINT 的命令行會被執行,但是調用的參數是.yaml中的 args,CMD 的參數會被覆蓋,但是 ENTRYPOINT 自帶的參數還是會執行的。
    cat << EOF > test3.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: test3
    spec:
     replicas: 1
     selector:
       matchLabels:
         app: test3
     template:
       metadata:
         labels:
           app: test3
       spec:
         nodeName: local-168-182-110
         containers:
         - name: test3
           image: test:v1
           # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會輸出hello,只能通過這樣傳參,['/bin/sh','-c','/test.sh command'];CMD里面的參數會被忽略
           # command: ['/test.sh']
           # command帶參數
           # command: ['/test.sh','command']
           args: ['args']
    EOF

    4)command 和 args 都存在場景測試

    • 如果如果 command 和 args 都寫了,那么 Docker 默認的配置被忽略,使用.yaml的配置。
    cat << EOF > test4.yaml
    apiVersion: apps/v1
    kind: Deployment
    metadata:
     name: test4
    spec:
     replicas: 1
     selector:
       matchLabels:
         app: test4
     template:
       metadata:
         labels:
           app: test4
       spec:
         nodeName: local-168-182-110
         containers:
         - name: test4
           image: test:v1
           # ['/bin/sh','-c','/test.sh command','hello'],加了'/bin/sh','-c',也是不能外部傳參,不會輸出hello,只能通過這樣傳參,['/bin/sh','-c','/test.sh command'];CMD里面的參數會被忽略
           # command: ['/test.sh']
           # command帶參數,command和args都會帶上
           command: ['/test.sh','command']
           args: ['args']
    EOF

    鏡像構建 Dockerfile 的介紹就到這里了!

    分享到:
    標簽:保姆 入門 構建 示例 鏡像
    用戶無頭像

    網友整理

    注冊時間:

    網站:5 個   小程序:0 個  文章:12 篇

    • 51998

      網站

    • 12

      小程序

    • 1030137

      文章

    • 747

      會員

    趕快注冊賬號,推廣您的網站吧!
    最新入駐小程序

    數獨大挑戰2018-06-03

    數獨一種數學游戲,玩家需要根據9

    答題星2018-06-03

    您可以通過答題星輕松地創建試卷

    全階人生考試2018-06-03

    各種考試題,題庫,初中,高中,大學四六

    運動步數有氧達人2018-06-03

    記錄運動步數,積累氧氣值。還可偷

    每日養生app2018-06-03

    每日養生,天天健康

    體育訓練成績評定2018-06-03

    通用課目體育訓練成績評定