docker file的介绍
Dockerfile是一個(gè)普通的文本文件,里面包含了許多可以在命令行接口上執(zhí)行的用來(lái)構(gòu)建鏡像的相關(guān)指令,我們通過(guò)docker build指令就可以讀取Dockerfile文件中的指令并執(zhí)行自動(dòng)化鏡像構(gòu)建。
一般情況下,Dockerfile文件可分為四個(gè)部分:基礎(chǔ)鏡像信息、維護(hù)者信息、鏡像操作指令和容器啟動(dòng)時(shí)的執(zhí)行指令,其基本結(jié)構(gòu)如文件1所示。
文件1 Dockerfile
1 #定義基礎(chǔ)鏡像信息
2 FROM ubuntu
3 # 定義該鏡像的維護(hù)者信息
4 MAINTAINER docker_user docker_user@email.com
5 # 一些鏡像操作指令
6 RUN echo “deb http://archive.ubuntu.com/ubuntu/ raring main universe”
7 >> /etc/apt/sources.list
8 RUN apt-get update && apt-get install -y nginx
9 RUN echo “\ndaemon off;” >> /etc/nginx/nginx.conf
10 # 當(dāng)容器啟動(dòng)時(shí)要執(zhí)行的指令
11 CMD /usr/sbin/nginx
從文件1可以看出,Dockerfile文件由多條命令語(yǔ)句組成,每條語(yǔ)句都代表一個(gè)指令。其中以“#”開頭的指令表示注釋,另外當(dāng)一條指令過(guò)長(zhǎng)時(shí),可以使用反斜杠“\”進(jìn)行指令換行,這樣一條較長(zhǎng)的指令就會(huì)被分為多行顯示。
小提示:
Dockerfile文件是Docker構(gòu)建鏡像的腳本文件,名字可以自定義,但在構(gòu)建鏡像時(shí)默認(rèn)使用的是Dockerfile文件。當(dāng)定義為其他名稱時(shí),在進(jìn)行鏡像構(gòu)建時(shí),必須指定該腳本文件的位置和名稱。因此,通常情況下,推薦直接使用默認(rèn)的Dockerfile進(jìn)行命名。
在編寫Dockerfile腳本文件時(shí),開發(fā)者根據(jù)實(shí)際需要會(huì)使用到各種指令,如FROM、CMD、ADD等,這些常用指令及其說(shuō)明如表1所示。
表1 Dockerfile常用指令
指令 說(shuō)明
FROM 指定基礎(chǔ)鏡像
MAINTAINER 指定鏡像維護(hù)者信息
RUN 用于執(zhí)行指定腳本命令
CMD 指定啟動(dòng)容器時(shí)執(zhí)行的命令
EXPOSE 指定容器暴露的端口
ENV 指定環(huán)境變量
ADD 將文件從宿主機(jī)復(fù)制到容器指定位置,同時(shí)對(duì)壓縮文件有自動(dòng)解壓功能
COPY 將文件從宿主機(jī)復(fù)制到容器指定位置
ENTRYPOINT 設(shè)置容器啟動(dòng)時(shí)需要運(yùn)行的命令
WORKDIR 為后續(xù)的如RUN、CMD、ENTRYPOINT、COPY、ADD指定工作目錄
在表1中,列舉了Dockerfile文件中的一些常用指令,并分別對(duì)其作用進(jìn)行了簡(jiǎn)要說(shuō)明。為了幫助讀者更好的掌握這些指令的使用,接下來(lái)將對(duì)這些常用指令的使用進(jìn)行詳細(xì)講解。
1.FROM
FROM指令用于初始化一個(gè)新的鏡像構(gòu)建階段,同時(shí)為之后的指令設(shè)置一個(gè)基礎(chǔ)鏡像。設(shè)定的基礎(chǔ)鏡像可以從DockerHub鏡像注冊(cè)中心或者本地鏡像列表選取,當(dāng)本地鏡像列表中存在設(shè)定的鏡像就會(huì)直接使用本地鏡像,否則會(huì)先從遠(yuǎn)程鏡像注冊(cè)中心拉取到本地再使用。
FROM指令使用的語(yǔ)法格式如下。
FROM
FROM :
具體示例如下。
FROM ubuntu
FROM ubuntu:16.04
在使用FROM指令時(shí),需要注意以下幾點(diǎn)。
● 一個(gè)有效的Dockerfile文件必須以FROM指令開頭(除了ARG指令);
● 為了創(chuàng)建多重鏡像或者互相依賴的鏡像,在同一個(gè)Dockerfile文件中可能會(huì)出現(xiàn)多個(gè)FROM指令;
● 參數(shù)是可選的,其作用主要是進(jìn)一步對(duì)鏡像區(qū)分,例如版本、型號(hào)等(如上述示例中的ubuntu:16.04就表示版本號(hào)為16.04的ubuntu)。如果沒(méi)有使用該參數(shù),則默認(rèn)是latest;如果設(shè)置的參數(shù)不存在,則構(gòu)建鏡像也會(huì)失敗。
2.MAINTAINER
MAINTAINER指令用于指定當(dāng)前構(gòu)建的鏡像維護(hù)者信息,該指令沒(méi)有具體的格式要求,通常建議使用用戶名和郵箱進(jìn)行標(biāo)識(shí),具體示例如下。
MAINTAINER "shitou"shitou@163.com
3.RUN
RUN指令用于執(zhí)行指定的腳本命令,有兩種格式,其語(yǔ)法格式如下。
RUN
RUN [“executable”, “param1”, “param2”]
前者將在 shell 終端中運(yùn)行命令,即 /bin/sh -c;后者則使用 exec 執(zhí)行。指定使用其他終端可以通過(guò)第二種方式實(shí)現(xiàn),例如 RUN ["/bin/bash", “-c”, “echo hello”]。
其中每條 RUN 指令將在當(dāng)前鏡像基礎(chǔ)上執(zhí)行指定命令,并提交為新的鏡像。如果要執(zhí)行多條RUN指令,通常會(huì)將多條RUN指令合成一條,并使用斜杠“\” 來(lái)?yè)Q行,這樣將減小所構(gòu)建的鏡像的體積。
4.CMD
CMD指令用于指定啟動(dòng)容器時(shí)執(zhí)行的命令,該指令有三種格式,其語(yǔ)法格式如下。
CMD [“executable”,“param1”,“param2”] #使用 exec 執(zhí)行,也是推薦方式;
CMD command param1 param2 #在 /bin/sh 中執(zhí)行,提供給需要交互的應(yīng)用;
CMD [“param1”,“param2”] #提供給 ENTRYPOINT 的默認(rèn)參數(shù);
需要注意的是,在使用CMD指令時(shí),每個(gè) Dockerfile 只能有一條 CMD 指令,如果有多條CMD指令,則只有最后一條生效。如果用戶啟動(dòng)容器時(shí)指定了運(yùn)行的指令,則會(huì)覆蓋掉CMD指定的指令。
5.EXPOSE
EXPOSE指令用于聲明容器內(nèi)部暴露的端口號(hào),供容器訪問(wèn)連接使用,其語(yǔ)法格式如下。
EXPOSE […]
6.ENV
ENV指令用于為下文設(shè)定一個(gè)環(huán)境變量,該變量值在后續(xù)指令或內(nèi)聯(lián)文件中都可以使用。ENV指令有兩種語(yǔ)法格式,具體如下。
ENV
ENV = = …
在上述兩種語(yǔ)法格式中,第一種格式為一個(gè)屬性設(shè)置唯一的屬性值,屬性第一個(gè)空格之后的所有字符串(包括空格、引號(hào))都將被視為該屬性的值;第二種格式允許同時(shí)為多個(gè)屬性賦值,而這種方式里面的引號(hào)、反斜杠等將被解析掉。
7.ADD
ADD指令用于復(fù)制指定的 src資源文件到容器中的 dest目錄下,復(fù)制的資源可以是文件、目錄以及遠(yuǎn)程URLs資源。其語(yǔ)法格式如下。
ADD …
在使用ADD指令時(shí),復(fù)制的src資源文件必須是當(dāng)前上下文目錄或其子目錄,而復(fù)制的內(nèi)容實(shí)際上是該目錄下的所有內(nèi)容,其中包括文件系統(tǒng)元數(shù)據(jù),而目錄本身不會(huì)被復(fù)制。當(dāng)dest目錄不存在時(shí),會(huì)在復(fù)制文件時(shí)自動(dòng)創(chuàng)建。需要注意的是,當(dāng)使用ADD指令復(fù)制的文件是一個(gè)壓縮包時(shí),ADD指令會(huì)在復(fù)制好該文件后,自動(dòng)進(jìn)行解壓。
在使用ADD指令時(shí),復(fù)制的src資源文件路徑允許使用通配符,而dest目標(biāo)目錄可以使用絕對(duì)路徑,也可以使用預(yù)先用WORKDIR指令定義的相對(duì)路徑。
8.COPY
COPY指令的作用與ADD指令類似,都是復(fù)制指定的src資源文件到容器中的 dest目錄下。區(qū)別在于,COPY指令不能復(fù)制遠(yuǎn)程URL路徑文件,也不能解壓文件,而ADD指令則可以。其語(yǔ)法格式如下。
COPY …
9.ENTRYPOINT
ENTRYPOINT指令是配置容器啟動(dòng)后執(zhí)行的命令,每個(gè)Dockerfile中只能有一個(gè)ENTRYPOINT,當(dāng)指定多個(gè)ENTRYPOINT指令時(shí),只有最后一個(gè)生效。該指令有兩種語(yǔ)法格式,其語(yǔ)法格式如下。
ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式, 推薦的)
ENTRYPOINT command param1 param2 (shell 格式)
10.WORKDIR
WORKDIR指令用于為后續(xù)的指令(如RUN、CMD、ENTRYPOINT、COPY、ADD)指定工作目錄,在同一個(gè)Dockerfile文件中可以多次使用WORKDIR指令,其語(yǔ)法格式如下。
WORKDIR /path/to/workdir
至此,關(guān)于Dockerfile文件中的常用指令已介紹完畢,讀者可以根據(jù)自身實(shí)際情況選取使用。Dockerfile的更多指令可以參考Dockerfile官網(wǎng)學(xué)習(xí),具體地址為https://docs.docker.com/engine/reference/builder/#arg。
在實(shí)際情況下,Docker在讀取應(yīng)用上下文中的Dockerfile文件進(jìn)行鏡像構(gòu)建之前,都會(huì)先查看當(dāng)前應(yīng)用上下文中是否包含一個(gè)名為.dockerignore的文件,如果該文件存在,則Docker會(huì)先將.dockerignore文件中聲明的文件或目錄進(jìn)行排除,然后再讀取Dockerfile進(jìn)行鏡像構(gòu)建。使用.dockerignore將有助于在進(jìn)行文件復(fù)制過(guò)程中避免向進(jìn)程中加入過(guò)大或者敏感的無(wú)用文件和目錄。
.dockerignore文件同Dockerfile文件一樣,也是一個(gè)文本文件。二者的主要區(qū)別在于.dockerignore中存放的是被排除的文件,而Dockerfile中存放的是需要執(zhí)行的指令。
接下來(lái),通過(guò)一個(gè)簡(jiǎn)單的示例來(lái)講解.dockerignore文件內(nèi)容的編寫,如文件1所示。
文件1 .dockerignore
1 # comment
2 /temp
3 //temp*
4 temp?
在文件1中,第1行代碼表示注釋內(nèi)容,其余3行代碼均為被排除的文件。從被排除文件的編寫方式可以看出,.dockerignore文件中可以使用通配符排除匹配路徑下的文件。
下面針對(duì)使用通配符排除匹配路徑下的文件進(jìn)行具體分析。
● /temp:排除根目錄下任意子目錄中所有名字以temp開頭的文件或目錄。例如文件/somedir/temporary.txt會(huì)被排除。
● //temp*:排除根目錄下任意兩級(jí)子目錄中所有名字以temp開頭的文件或目錄。例如文件/somedir/subdir/temporary.txt會(huì)被排除。
● temp?:排除根目錄下名字以temp開頭,后面為任意一個(gè)字符的文件或目錄。例如目錄/tempa和/tempb都將被排除。
小提示:
在前面幾個(gè)小節(jié)中,具體介紹了Dockerfile的基本結(jié)構(gòu)和常用指令,讀者想要寫出好的Dockerfile文件就必須對(duì)具體的需求、一些shell命令以及注意事項(xiàng)有所了解,這些內(nèi)容可以通過(guò)參考官方文檔學(xué)習(xí),其地址https://rock-it.pl/how-to-write-excellent-dockerfiles/。
總結(jié)
以上是生活随笔為你收集整理的docker file的介绍的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker的运行机制
- 下一篇: JAVA16版本.JDK16即将发布,你