docker file的介紹
DockerFile是一個普通的文本文件,里面包含了許多可以在命令行接口上執行的用來構建鏡像的相關指令,我們通過docker build指令就可以讀取DockerFile文件中的指令并執行自動化鏡像構建。
一般情況下,Dockerfile文件可分為四個部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時的執行指令,其基本結構如文件1所示。
文件1 Dockerfile
1 #定義基礎鏡像信息
2 FROM ubuntu
3 # 定義該鏡像的維護者信息
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 # 當容器啟動時要執行的指令
11 CMD /usr/sbin/nginx
從文件1可以看出,Dockerfile文件由多條命令語句組成,每條語句都代表一個指令。其中以“#”開頭的指令表示注釋,另外當一條指令過長時,可以使用反斜杠“\”進行指令換行,這樣一條較長的指令就會被分為多行顯示。
小提示:
Dockerfile文件是Docker構建鏡像的腳本文件,名字可以自定義,但在構建鏡像時默認使用的是Dockerfile文件。當定義為其他名稱時,在進行鏡像構建時,必須指定該腳本文件的位置和名稱。因此,通常情況下,推薦直接使用默認的Dockerfile進行命名。
在編寫Dockerfile腳本文件時,開發者根據實際需要會使用到各種指令,如FROM、CMD、ADD等,這些常用指令及其說明如表1所示。
表1 Dockerfile常用指令
指令 說明
FROM 指定基礎鏡像
MAINTAINER 指定鏡像維護者信息
RUN 用于執行指定腳本命令
CMD 指定啟動容器時執行的命令
EXPOSE 指定容器暴露的端口
ENV 指定環境變量
ADD 將文件從宿主機復制到容器指定位置,同時對壓縮文件有自動解壓功能
COPY 將文件從宿主機復制到容器指定位置
ENTRYPOINT 設置容器啟動時需要運行的命令
WORKDIR 為后續的如RUN、CMD、ENTRYPOINT、COPY、ADD指定工作目錄
在表1中,列舉了Dockerfile文件中的一些常用指令,并分別對其作用進行了簡要說明。為了幫助讀者更好的掌握這些指令的使用,接下來將對這些常用指令的使用進行詳細講解。
1.FROM
FROM指令用于初始化一個新的鏡像構建階段,同時為之后的指令設置一個基礎鏡像。設定的基礎鏡像可以從DockerHub鏡像注冊中心或者本地鏡像列表選取,當本地鏡像列表中存在設定的鏡像就會直接使用本地鏡像,否則會先從遠程鏡像注冊中心拉取到本地再使用。
FROM指令使用的語法格式如下。
FROM
FROM :
具體示例如下。
FROM ubuntu
FROM ubuntu:16.04
在使用FROM指令時,需要注意以下幾點。
● 一個有效的Dockerfile文件必須以FROM指令開頭(除了ARG指令);
● 為了創建多重鏡像或者互相依賴的鏡像,在同一個Dockerfile文件中可能會出現多個FROM指令;
● 參數是可選的,其作用主要是進一步對鏡像區分,例如版本、型號等(如上述示例中的ubuntu:16.04就表示版本號為16.04的ubuntu)。如果沒有使用該參數,則默認是latest;如果設置的參數不存在,則構建鏡像也會失敗。
2.MAINTAINER
MAINTAINER指令用于指定當前構建的鏡像維護者信息,該指令沒有具體的格式要求,通常建議使用用戶名和郵箱進行標識,具體示例如下。
MAINTAINER "shitou"shitou@163.com
3.RUN
RUN指令用于執行指定的腳本命令,有兩種格式,其語法格式如下。
RUN
RUN [“executable”, “param1”, “param2”]
前者將在 shell 終端中運行命令,即 /bin/sh -c;后者則使用 exec 執行。指定使用其他終端可以通過第二種方式實現,例如 RUN ["/bin/bash", “-c”, “echo hello”]。
其中每條 RUN 指令將在當前鏡像基礎上執行指定命令,并提交為新的鏡像。如果要執行多條RUN指令,通常會將多條RUN指令合成一條,并使用斜杠“\” 來換行,這樣將減小所構建的鏡像的體積。
4.CMD
CMD指令用于指定啟動容器時執行的命令,該指令有三種格式,其語法格式如下。
CMD [“executable”,“param1”,“param2”] #使用 exec 執行,也是推薦方式;
CMD command param1 param2 #在 /bin/sh 中執行,提供給需要交互的應用;
CMD [“param1”,“param2”] #提供給 ENTRYPOINT 的默認參數;
需要注意的是,在使用CMD指令時,每個 Dockerfile 只能有一條 CMD 指令,如果有多條CMD指令,則只有最后一條生效。如果用戶啟動容器時指定了運行的指令,則會覆蓋掉CMD指定的指令。
5.EXPOSE
EXPOSE指令用于聲明容器內部暴露的端口號,供容器訪問連接使用,其語法格式如下。
EXPOSE […]
6.ENV
ENV指令用于為下文設定一個環境變量,該變量值在后續指令或內聯文件中都可以使用。ENV指令有兩種語法格式,具體如下。
ENV
ENV = = …
在上述兩種語法格式中,第一種格式為一個屬性設置唯一的屬性值,屬性第一個空格之后的所有字符串(包括空格、引號)都將被視為該屬性的值;第二種格式允許同時為多個屬性賦值,而這種方式里面的引號、反斜杠等將被解析掉。
7.ADD
ADD指令用于復制指定的 src資源文件到容器中的 dest目錄下,復制的資源可以是文件、目錄以及遠程URLs資源。其語法格式如下。
ADD …
在使用ADD指令時,復制的src資源文件必須是當前上下文目錄或其子目錄,而復制的內容實際上是該目錄下的所有內容,其中包括文件系統元數據,而目錄本身不會被復制。當dest目錄不存在時,會在復制文件時自動創建。需要注意的是,當使用ADD指令復制的文件是一個壓縮包時,ADD指令會在復制好該文件后,自動進行解壓。
在使用ADD指令時,復制的src資源文件路徑允許使用通配符,而dest目標目錄可以使用絕對路徑,也可以使用預先用WORKDIR指令定義的相對路徑。
8.COPY
COPY指令的作用與ADD指令類似,都是復制指定的src資源文件到容器中的 dest目錄下。區別在于,COPY指令不能復制遠程URL路徑文件,也不能解壓文件,而ADD指令則可以。其語法格式如下。
COPY …
9.ENTRYPOINT
ENTRYPOINT指令是配置容器啟動后執行的命令,每個Dockerfile中只能有一個ENTRYPOINT,當指定多個ENTRYPOINT指令時,只有最后一個生效。該指令有兩種語法格式,其語法格式如下。
ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式, 推薦的)
ENTRYPOINT command param1 param2 (shell 格式)
10.WORKDIR
WORKDIR指令用于為后續的指令(如RUN、CMD、ENTRYPOINT、COPY、ADD)指定工作目錄,在同一個Dockerfile文件中可以多次使用WORKDIR指令,其語法格式如下。
WORKDIR /path/to/workdir
至此,關于Dockerfile文件中的常用指令已介紹完畢,讀者可以根據自身實際情況選取使用。Dockerfile的更多指令可以參考Dockerfile官網學習,具體地址為https://docs.docker.com/engine/reference/builder/#arg。
在實際情況下,Docker在讀取應用上下文中的Dockerfile文件進行鏡像構建之前,都會先查看當前應用上下文中是否包含一個名為.dockerignore的文件,如果該文件存在,則Docker會先將.dockerignore文件中聲明的文件或目錄進行排除,然后再讀取Dockerfile進行鏡像構建。使用.dockerignore將有助于在進行文件復制過程中避免向進程中加入過大或者敏感的無用文件和目錄。
.dockerignore文件同Dockerfile文件一樣,也是一個文本文件。二者的主要區別在于.dockerignore中存放的是被排除的文件,而Dockerfile中存放的是需要執行的指令。
接下來,通過一個簡單的示例來講解.dockerignore文件內容的編寫,如文件1所示。
文件1 .dockerignore
1 # comment
2 /temp
3 //temp*
4 temp?
在文件1中,第1行代碼表示注釋內容,其余3行代碼均為被排除的文件。從被排除文件的編寫方式可以看出,.dockerignore文件中可以使用通配符排除匹配路徑下的文件。
下面針對使用通配符排除匹配路徑下的文件進行具體分析。
● /temp:排除根目錄下任意子目錄中所有名字以temp開頭的文件或目錄。例如文件/somedir/temporary.txt會被排除。
● //temp*:排除根目錄下任意兩級子目錄中所有名字以temp開頭的文件或目錄。例如文件/somedir/subdir/temporary.txt會被排除。
● temp?:排除根目錄下名字以temp開頭,后面為任意一個字符的文件或目錄。例如目錄/tempa和/tempb都將被排除。
小提示:
在前面幾個小節中,具體介紹了Dockerfile的基本結構和常用指令,讀者想要寫出好的Dockerfile文件就必須對具體的需求、一些shell命令以及注意事項有所了解,這些內容可以通過參考官方文檔學習,其地址https://rock-it.pl/how-to-write-excellent-dockerfiles/。
Docker 鏡像服務
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。