成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

docker中dockerfile語法如何使用

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

成都網(wǎng)站建設(shè)、網(wǎng)站制作過程中,需要針對客戶的行業(yè)特點(diǎn)、產(chǎn)品特性、目標(biāo)受眾和市場情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計(jì)方向。創(chuàng)新互聯(lián)公司還需要根據(jù)客戶的需求進(jìn)行功能模塊的開發(fā)和設(shè)計(jì),包括內(nèi)容管理、前臺(tái)展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計(jì)和安全保護(hù)等功能。

  • FROM關(guān)鍵字

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

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

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

 例:

FROM scratch #制作base imageFROM centos  #以centos作為base image
  • LABEL關(guān)鍵字

        為鏡像指定標(biāo)簽,語法:

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

        一個(gè)Dockerfile種可以有多個(gè)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."

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

      如下:

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

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

例:

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

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

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

    第一種后邊直接跟shell命令

  • 在linux操作系統(tǒng)上默認(rèn) /bin/sh -c

  • 在windows操作系統(tǒng)上默認(rèn) cmd /S /C

    第二種是類似于函數(shù)調(diào)用??蓪xecutable理解成為可執(zhí)行文件,后面就是兩個(gè)參數(shù)。

    兩種寫法比對:

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

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

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

當(dāng)命令較多,或較長時(shí),建議將命令換行,RUN書寫時(shí)的換行符是 \

例:

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關(guān)鍵字

      設(shè)置工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。相當(dāng)于 cd,如果不存在要打開的目錄則會(huì)創(chuàng)建,可以設(shè)置多次。語法:

WORKDIR /path/to/workdir

    例:

WORKDIR /ROOT  #將工作目錄切換到root下
WORKDIR /test  #將工作目錄切換到test目錄  沒有則創(chuàng)建
WORKDIR demo   #結(jié)合上一句 此時(shí)工作目錄被切換到/test/demo目錄下

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

  • ADD關(guān)鍵字

       一個(gè)復(fù)制命令,把文件復(fù)制到鏡像中。如果把宿主機(jī)與容器想象成兩臺(tái)linux服務(wù)器的話,那么這個(gè)命令就類似于scp,只是scp需要加用戶名和密碼的權(quán)限驗(yàn)證,而ADD不用。語法如下:

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

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

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

如以下寫法都是可以的:

  • ADD test relativeDir/   #將test復(fù)制到容器內(nèi),相對于當(dāng)前工作目錄下的relativeDir目錄中

  • ADD test /relativeDir  #將test復(fù)制到容器內(nèi)根目錄下relativeDir目錄中

  • ADD http://example.com/foobar /   #將網(wǎng)絡(luò)文件下載到根目錄下

    盡量不要把<scr>寫成一個(gè)文件夾,如果<src>是一個(gè)文件夾了,將復(fù)制整個(gè)目錄的內(nèi)容,包括文件系統(tǒng)元數(shù)據(jù)

    有如下注意事項(xiàng):

    1、如果源路徑是個(gè)文件,且目標(biāo)路徑是以 / 結(jié)尾, 則docker會(huì)把目標(biāo)路徑當(dāng)作一個(gè)目錄,會(huì)把源文件拷貝到該目錄下。如果目標(biāo)路徑不存在,則會(huì)自動(dòng)創(chuàng)建目標(biāo)路徑。

    2、如果源路徑是個(gè)文件,且目標(biāo)路徑是不是以 / 結(jié)尾,則docker會(huì)把目標(biāo)路徑當(dāng)作一個(gè)文件。如果目標(biāo)路徑不存在,會(huì)以目標(biāo)路徑為名創(chuàng)建一個(gè)文件,內(nèi)容同源文件;如果目標(biāo)文件是個(gè)存在的文件,會(huì)用源文件覆蓋它,當(dāng)然只是內(nèi)容覆蓋,文件名還是目標(biāo)文件名。如果目標(biāo)文件實(shí)際是個(gè)存在的目錄,則會(huì)源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結(jié)尾,以避免混淆。

    3、如果源路徑是個(gè)目錄,且目標(biāo)路徑不存在,則docker會(huì)自動(dòng)以目標(biāo)路徑創(chuàng)建一個(gè)目錄,把源路徑目錄下的文件拷貝進(jìn)來。如果目標(biāo)路徑是個(gè)已經(jīng)存在的目錄,則docker會(huì)把源路徑目錄下的文件拷貝到該目錄下。

    4、如果源文件是個(gè)歸檔文件(壓縮文件),則docker會(huì)自動(dòng)幫解壓。

  • COPY關(guān)鍵字

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

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

    例:

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

    功能為設(shè)置環(huán)境變量設(shè)置常量,語法有兩種:   

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

    兩者的區(qū)別就是第一種是一次設(shè)置一個(gè),第二種是一次設(shè)置多個(gè)。

例:

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

    功能為容器啟動(dòng)時(shí)要運(yùn)行的命令,語法有三種寫法

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

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

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

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

    補(bǔ)充細(xì)節(jié):這里邊包括參數(shù)的一定要用雙引號(hào),就是",不能是單引號(hào)。千萬不能寫成單引號(hào),原因是參數(shù)傳遞后,docker解析的是一個(gè)JSON array

    注意事項(xiàng):

  •  容器啟動(dòng)時(shí)默認(rèn)執(zhí)行的命令

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

  • 如果定義了多個(gè)CMD,只有最后一個(gè)會(huì)執(zhí)行

  •     RUN & CMD

    不要把RUN和CMD搞混了。RUN是構(gòu)件容器時(shí)就運(yùn)行的命令以及提交運(yùn)行結(jié)果,CMD是容器啟動(dòng)時(shí)執(zhí)行的命令,在構(gòu)件時(shí)并不運(yùn)行,構(gòu)件時(shí)緊緊指定了這個(gè)命令到底是個(gè)什么樣子

  • ENTRYPOINT關(guān)鍵字

        功能是啟動(dòng)時(shí)的默認(rèn)命令,語法如下:

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

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

    1. 相同點(diǎn):

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

  • 容器啟動(dòng)時(shí)才運(yùn)行,運(yùn)行時(shí)機(jī)相同

    2. 不同點(diǎn):

  •  ENTRYPOINT不會(huì)被運(yùn)行的command覆蓋,而CMD則會(huì)被覆蓋

  •  如果我們在Dockerfile種同時(shí)寫了ENTRYPOINT和CMD,并且CMD指令不是一個(gè)完整的可執(zhí)行命令,那么CMD指定的內(nèi)容將會(huì)作為ENTRYPOINT的參數(shù)

  • shell格式:即把要運(yùn)行的命令當(dāng)做shell執(zhí)行

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

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

    例:以下兩個(gè)dockerfile結(jié)果相同

FROM centos  #指定基礎(chǔ)鏡像為centos
EVN name Docker   #設(shè)定常量name 值為Docker
ENTRYPOINT echo "hello $name"  #執(zhí)行acho命令

 以上dockerfile生成的鏡像運(yùn)行容器時(shí)輸出 hello Docker

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

以上dockerfile生成的鏡像運(yùn)行容器時(shí)輸出 hello $name,因?yàn)?nbsp;ENTRYPOINT ["/bin/echo", "hello $name"] 指定容器啟動(dòng)時(shí)運(yùn)行的就是echo命令  不會(huì)識(shí)別$為變量,做如下修改:

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

容器啟動(dòng)時(shí)輸出 hello Docker

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

分享文章:docker中dockerfile語法如何使用
網(wǎng)站鏈接:http://jinyejixie.com/article18/gpegdp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供域名注冊網(wǎng)站營銷、服務(wù)器托管網(wǎng)站設(shè)計(jì)網(wǎng)站改版、手機(jī)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
咸丰县| 武定县| 武义县| 广平县| 达尔| 连山| 金川县| 新沂市| 河西区| 新田县| 北辰区| 九江县| 永登县| 新余市| 东兰县| 柞水县| 东辽县| 长垣县| 资中县| 宁南县| 观塘区| 桃园县| 根河市| 万荣县| 延吉市| 桃江县| 扎囊县| 天柱县| 巫溪县| 新丰县| 宁都县| 松江区| 满城县| 达孜县| 常宁市| 哈尔滨市| 吴川市| 南昌县| 满洲里市| 彰化县| 依兰县|