這篇文章將為大家詳細(xì)講解有關(guān)docker中dockerfile語法如何使用,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關(guān)知識有一定的了解。
在成都網(wǎng)站建設(shè)、網(wǎng)站制作過程中,需要針對客戶的行業(yè)特點、產(chǎn)品特性、目標(biāo)受眾和市場情況進(jìn)行定位分析,以確定網(wǎng)站的風(fēng)格、色彩、版式、交互等方面的設(shè)計方向。創(chuàng)新互聯(lián)公司還需要根據(jù)客戶的需求進(jìn)行功能模塊的開發(fā)和設(shè)計,包括內(nèi)容管理、前臺展示、用戶權(quán)限管理、數(shù)據(jù)統(tǒng)計和安全保護(hù)等功能。
指定基礎(chǔ)鏡像,并且必須是第一條指令。如果不以任何鏡像為基礎(chǔ),那么寫法為:FROM scratch。同時意味著接下來所寫的指令將作為鏡像的第一層開始,語法:
FROMFROM : FROM :
三種寫法,其中
例:
FROM scratch #制作base imageFROM centos #以centos作為base image
為鏡像指定標(biāo)簽,語法:
LABEL= = = ...
一個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會繼承基礎(chǔ)鏡像種的LABEL,如遇到key相同,則值覆蓋
例:
LABEL maintainer="asd@163.com" #維護(hù)者信息 LABEL version="1.0" #版本 LABEL description="這是描述" #鏡像描述信息
功能為運行指定的命令,每運行一次RUN對image而言都生成新的一層,RUN命令有兩種格式
1. RUN2. 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í)行文件,后面就是兩個參數(shù)。
兩種寫法比對:
RUN /bin/bash -c 'source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要寫多個RUN,原因是Dockerfile中每一個指令都會建立一層.多少個RUN就構(gòu)建了多少層鏡像,會造成鏡像的臃腫、多層,不僅僅增加了構(gòu)件部署的時間,還容易出錯。
當(dāng)命令較多,或較長時,建議將命令換行,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/*
設(shè)置工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。相當(dāng)于 cd,如果不存在要打開的目錄則會創(chuàng)建,可以設(shè)置多次。語法:
WORKDIR /path/to/workdir
例:
WORKDIR /ROOT #將工作目錄切換到root下
WORKDIR /test #將工作目錄切換到test目錄 沒有則創(chuàng)建 WORKDIR demo #結(jié)合上一句 此時工作目錄被切換到/test/demo目錄下
盡量使用WORKDIR,而不使用RUN cd,盡量使用局對目錄。
一個復(fù)制命令,把文件復(fù)制到鏡像中。如果把宿主機(jī)與容器想象成兩臺linux 如以下寫法都是可以的: 盡量不要把 有如下注意事項: 1、如果源路徑是個文件,且目標(biāo)路徑是以 / 結(jié)尾, 則docker會把目標(biāo)路徑當(dāng)作一個目錄,會把源文件拷貝到該目錄下。如果目標(biāo)路徑不存在,則會自動創(chuàng)建目標(biāo)路徑。 2、如果源路徑是個文件,且目標(biāo)路徑是不是以 / 結(jié)尾,則docker會把目標(biāo)路徑當(dāng)作一個文件。如果目標(biāo)路徑不存在,會以目標(biāo)路徑為名創(chuàng)建一個文件,內(nèi)容同源文件;如果目標(biāo)文件是個存在的文件,會用源文件覆蓋它,當(dāng)然只是內(nèi)容覆蓋,文件名還是目標(biāo)文件名。如果目標(biāo)文件實際是個存在的目錄,則會源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結(jié)尾,以避免混淆。 3、如果源路徑是個目錄,且目標(biāo)路徑不存在,則docker會自動以目標(biāo)路徑創(chuàng)建一個目錄,把源路徑目錄下的文件拷貝進(jìn)來。如果目標(biāo)路徑是個已經(jīng)存在的目錄,則docker會把源路徑目錄下的文件拷貝到該目錄下。 4、如果源文件是個歸檔文件(壓縮文件),則docker會自動幫解壓。 看這個名字就知道,又是一個復(fù)制命令,與ADD用法基本相同,COPY的 例: 功能為設(shè)置環(huán)境變量設(shè)置常量,語法有兩種: 兩者的區(qū)別就是第一種是一次設(shè)置一個,第二種是一次設(shè)置多個。 例: 功能為容器啟動時要運行的命令,語法有三種寫法 第三種比較好理解了,就時shell這種執(zhí)行方式和寫法,第一種和第二種其實都是可執(zhí)行文件加上參數(shù)的形式,舉例說明兩種寫法: 補(bǔ)充細(xì)節(jié):這里邊包括參數(shù)的一定要用雙引號,就是",不能是單引號。千萬不能寫成單引號,原因是參數(shù)傳遞后,docker解析的是一個JSON array 注意事項: 容器啟動時默認(rèn)執(zhí)行的命令 如果docker run 指定了其他命令,CMD命令被忽略 如果定義了多個CMD,只有最后一個會執(zhí)行 RUN & CMD 不要把RUN和CMD搞混了。RUN是構(gòu)件容器時就運行的命令以及提交運行結(jié)果,CMD是容器啟動時執(zhí)行的命令,在構(gòu)件時并不運行,構(gòu)件時緊緊指定了這個命令到底是個什么樣子 ENTRYPOINT關(guān)鍵字 功能是啟動時的默認(rèn)命令,語法如下: 與CMD比較說明(這倆命令太像了,而且還可以配合使用): 1. 相同點: 只能寫一條,如果寫了多條,那么只有最后一條生效 容器啟動時才運行,運行時機(jī)相同 2. 不同點: ENTRYPOINT不會被運行的command覆蓋,而CMD則會被覆蓋 如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD,并且CMD指令不是一個完整的可執(zhí)行命令,那么CMD指定的內(nèi)容將會作為ENTRYPOINT的參數(shù) 例:以下兩個dockerfile結(jié)果相同 以上dockerfile生成的鏡像運行容器時輸出 hello Docker 以上dockerfile生成的鏡像運行容器時輸出 hello $name,因為 ENTRYPOINT ["/bin/echo", "hello $name"] 指定容器啟動時運行的就是echo命令 不會識別$為變量,做如下修改: 容器啟動時輸出 hello Docker 關(guān)于docker中dockerfile語法如何使用就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。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ò)文件下載到根目錄下
COPY關(guān)鍵字
1. COPY
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)鍵字
1. ENV
ENV MySQL_VERSION 5.6 #設(shè)置常量
RUN apt-get install -y mysql-server="${MYSQL_VERSION}" \ #使用常量
&& rm -rf /var/lib/apt/list/*
CMD關(guān)鍵字
1. CMD ["executable","param1","param2"]2. CMD ["param1","param2"]3. CMD command param1 param2
CMD [ "sh", "-c", "echo $HOME"
CMD [ "echo", "$HOME" ]
1. ENTRYPOINT ["executable", "param1", "param2"]2. ENTRYPOINT command param1 param2
shell格式:即把要運行的命令當(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"]
FROM centos #指定基礎(chǔ)鏡像為centos
EVN name Docker #設(shè)定常量name 值為Docker
ENTRYPOINT echo "hello $name" #執(zhí)行acho命令
FROM centos #指定基礎(chǔ)鏡像為centos
EVN name Docker #設(shè)定常量name 值為Docker
ENTRYPOINT ["/bin/echo", "hello $name"] #執(zhí)行acho命令
FROM centos #指定基礎(chǔ)鏡像為centos
EVN name Docker #設(shè)定常量name 值為Docker
ENTRYPOINT ["/bin/bash", "-c", "echo", "hello $name"] #在shell中執(zhí)行acho命令
當(dāng)前標(biāo)題:docker中dockerfile語法如何使用
URL網(wǎng)址:http://weahome.cn/article/gpegdp.html