中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

docker中dockerfile語法如何使用

發布時間:2021-07-30 14:26:04 來源:億速云 閱讀:113 作者:Leah 欄目:大數據

這篇文章將為大家詳細講解有關docker中dockerfile語法如何使用,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

  • FROM關鍵字

        指定基礎鏡像,并且必須是第一條指令。如果不以任何鏡像為基礎,那么寫法為:FROM scratch。同時意味著接下來所寫的指令將作為鏡像的第一層開始,語法:

FROM <image>FROM <image>:<tag>FROM <image>:<digest>

        三種寫法,其中<tag>和<digest> 是可選項,如果沒有選擇,那么默認值為latest,為了安全,盡量使用官方image作為base image

 例:

FROM scratch #制作base imageFROM centos  #以centos作為base image
  • LABEL關鍵字

        為鏡像指定標簽,語法:

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

        一個Dockerfile種可以有多個LABEL,如下:

LABEL "com.example.vendor"="ACME Incorporated"LABEL com.example.label-with-value="foo"LABEL version="1.0"LABEL description="This text illustrates \that label-values can span multiple lines."

     但是并不建議這樣寫,最好就寫成一行,如太長需要換行的話則使用\符號

      如下:

LABEL multi.label1="value1" \multi.label2="value2" \other="value3"

    說明:LABEL會繼承基礎鏡像種的LABEL,如遇到key相同,則值覆蓋

例:

LABEL maintainer="asd@163.com"  #維護者信息
LABEL version="1.0"             #版本
LABEL description="這是描述"     #鏡像描述信息
  • RUN關鍵字

    功能為運行指定的命令,每運行一次RUN對image而言都生成新的一層,RUN命令有兩種格式

1. RUN <command>
2. RUN ["executable", "param1", "param2"]

    第一種后邊直接跟shell命令

  • 在linux操作系統上默認 /bin/sh -c

  • 在windows操作系統上默認 cmd /S /C

    第二種是類似于函數調用。可將executable理解成為可執行文件,后面就是兩個參數。

    兩種寫法比對:

  • RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME


  • RUN ["/bin/bash", "-c", "echo hello"]


    注意:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層.多少個RUN就構建了多少層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構件部署的時間,還容易出錯。

當命令較多,或較長時,建議將命令換行,RUN書寫時的換行符是 \

例:

RUN yum update && yum install -y vim \
    python-dev
RUN apt-get update && apt-get install -y perl \
    pwgen --no-install-recommends && rm -rf \
    /var/lib/apt/list/*
  • WORKDIR關鍵字

      設置工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。相當于 cd,如果不存在要打開的目錄則會創建,可以設置多次。語法:

WORKDIR /path/to/workdir

    例:

WORKDIR /ROOT  #將工作目錄切換到root下
WORKDIR /test  #將工作目錄切換到test目錄  沒有則創建
WORKDIR demo   #結合上一句 此時工作目錄被切換到/test/demo目錄下

  盡量使用WORKDIR,而不使用RUN cd,盡量使用局對目錄。

  • ADD關鍵字

       一個復制命令,把文件復制到鏡像中。如果把宿主機與容器想象成兩臺linux服務器的話,那么這個命令就類似于scp,只是scp需要加用戶名和密碼的權限驗證,而ADD不用。語法如下:

1. ADD <src>... <dest>2. ADD ["<src>",... "<dest>"]

<dest>路徑的填寫可以是容器內的絕對路徑,也可以是相對于工作目錄的相對路徑

<src>可以是一個本地文件或者是一個本地壓縮文件,還可以是一個url,如果把<src>寫成一個url,那么ADD就類似于wget命令,ADD不僅可以添加一個文件到指定目錄,而且還可以將添加的壓縮文件解壓縮,

如以下寫法都是可以的:

  • ADD test relativeDir/   #將test復制到容器內,相對于當前工作目錄下的relativeDir目錄中


  • ADD test /relativeDir  #將test復制到容器內根目錄下relativeDir目錄中


  • ADD http://example.com/foobar /   #將網絡文件下載到根目錄下


    盡量不要把<scr>寫成一個文件夾,如果<src>是一個文件夾了,將復制整個目錄的內容,包括文件系統元數據

    有如下注意事項:

    1、如果源路徑是個文件,且目標路徑是以 / 結尾, 則docker會把目標路徑當作一個目錄,會把源文件拷貝到該目錄下。如果目標路徑不存在,則會自動創建目標路徑。

    2、如果源路徑是個文件,且目標路徑是不是以 / 結尾,則docker會把目標路徑當作一個文件。如果目標路徑不存在,會以目標路徑為名創建一個文件,內容同源文件;如果目標文件是個存在的文件,會用源文件覆蓋它,當然只是內容覆蓋,文件名還是目標文件名。如果目標文件實際是個存在的目錄,則會源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結尾,以避免混淆。

    3、如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑創建一個目錄,把源路徑目錄下的文件拷貝進來。如果目標路徑是個已經存在的目錄,則docker會把源路徑目錄下的文件拷貝到該目錄下。

    4、如果源文件是個歸檔文件(壓縮文件),則docker會自動幫解壓。

  • COPY關鍵字

    看這個名字就知道,又是一個復制命令,與ADD用法基本相同,COPY的<src>只能是本地文件,語法如下:

1. COPY <src>... <dest>2. COPY ["<src>",... "<dest>"]

    例:

ADD hello /  #將hello文件復制到容器內根目錄下
ADD test.tar.gz /   #將壓縮文件添加到容器內根目錄下并解壓
WORKDIR /root  #將工作目錄切換到root目錄下
ADD hello test/   #將hello文件添加到/root/test目錄下
WORKDIR /root  #將工作目錄切換到root目錄下
copy hello test/ #將hello文件復制到/root/test
  • ENV關鍵字

    功能為設置環境變量設置常量,語法有兩種:   

1. ENV <key> <value>2. ENV <key>=<value> ...

    兩者的區別就是第一種是一次設置一個,第二種是一次設置多個。

例:

ENV MYSQL_VERSION 5.6 #設置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \   #使用常量
    && rm -rf /var/lib/apt/list/*
  • CMD關鍵字

    功能為容器啟動時要運行的命令,語法有三種寫法

1. CMD ["executable","param1","param2"]2. CMD ["param1","param2"]3. CMD command param1 param2

    第三種比較好理解了,就時shell這種執行方式和寫法,第一種和第二種其實都是可執行文件加上參數的形式,舉例說明兩種寫法:

  • CMD [ "sh", "-c", "echo $HOME"


  • CMD [ "echo", "$HOME" ]


    補充細節:這里邊包括參數的一定要用雙引號,就是",不能是單引號。千萬不能寫成單引號,原因是參數傳遞后,docker解析的是一個JSON array

    注意事項:

  •  容器啟動時默認執行的命令

  • 如果docker run 指定了其他命令,CMD命令被忽略

  • 如果定義了多個CMD,只有最后一個會執行

  •     RUN & CMD

    不要把RUN和CMD搞混了。RUN是構件容器時就運行的命令以及提交運行結果,CMD是容器啟動時執行的命令,在構件時并不運行,構件時緊緊指定了這個命令到底是個什么樣子

  • ENTRYPOINT關鍵字

        功能是啟動時的默認命令,語法如下:

1. ENTRYPOINT ["executable", "param1", "param2"]2. ENTRYPOINT command param1 param2

    與CMD比較說明(這倆命令太像了,而且還可以配合使用):

    1. 相同點:

  • 只能寫一條,如果寫了多條,那么只有最后一條生效

  • 容器啟動時才運行,運行時機相同

    2. 不同點:

  •  ENTRYPOINT不會被運行的command覆蓋,而CMD則會被覆蓋

  •  如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD,并且CMD指令不是一個完整的可執行命令,那么CMD指定的內容將會作為ENTRYPOINT的參數

  • shell格式:即把要運行的命令當做shell執行

RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
  • Exec格式:即是 命令,參數格式

RUN ["apt-get", "install", "-y", "vim"]
CMD ["/bin/echo", "hello docker"]
ENTRYPOINT ["/bin/echo", "hello docker"]

    例:以下兩個dockerfile結果相同

FROM centos  #指定基礎鏡像為centos
EVN name Docker   #設定常量name 值為Docker
ENTRYPOINT echo "hello $name"  #執行acho命令

 以上dockerfile生成的鏡像運行容器時輸出 hello Docker

FROM centos  #指定基礎鏡像為centos
EVN name Docker   #設定常量name 值為Docker
ENTRYPOINT ["/bin/echo", "hello $name"]  #執行acho命令

以上dockerfile生成的鏡像運行容器時輸出 hello $name,因為 ENTRYPOINT ["/bin/echo", "hello $name"] 指定容器啟動時運行的就是echo命令  不會識別$為變量,做如下修改:

FROM centos  #指定基礎鏡像為centos
EVN name Docker   #設定常量name 值為Docker
ENTRYPOINT ["/bin/bash", "-c", "echo", "hello $name"]  #在shell中執行acho命令

容器啟動時輸出 hello Docker

關于docker中dockerfile語法如何使用就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

黄龙县| 独山县| 喀什市| 泸定县| 湟源县| 东乡族自治县| 台前县| 礼泉县| 彝良县| 赤壁市| 南汇区| 高雄县| 安宁市| 济南市| 秦皇岛市| 额尔古纳市| 海兴县| 兴仁县| 自治县| 绵阳市| 秀山| 依安县| 洛隆县| 禄劝| 通许县| 曲松县| 彭水| 鄯善县| 政和县| 安龙县| 大邑县| 华阴市| 基隆市| 家居| 杭州市| 治县。| 双桥区| 铜鼓县| 连州市| 湖北省| 安徽省|