elasticsearch入門系列">elasticsearch入門系列
843
2022-05-30
前言
Dockerfile是一個包含用于組合映像的命令的文本文檔??梢允褂迷诿钚兄姓{用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。
docker build命令用于從Dockerfile構建映像。可以在docker build命令中使用-f標志指向文件系統中任何位置的Dockerfile。
例:
docker build -f /path/to/a/Dockerfile
一、Dockerfile的基本結構
Docker以從上到下的順序運行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個聲明以#字符開頭則被視為注釋??梢栽贒ocker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
二、Dockerfile文件指令說明
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
1.使用 Dockerfile 定制鏡像
1、下面以定制一個 nginx 鏡像(構建好的鏡像內會有一個 /usr/share/nginx/html/index.html 文件)
在一個空目錄下,新建一個名為 Dockerfile 文件,并在文件內添加以下內容:
FROM nginx RUN echo '這是一個本地構建的nginx鏡像' > /usr/share/nginx/html/index.html
2、FROM 和 RUN 指令的作用
FROM:定制的鏡像都是基于 FROM 的鏡像,這里的 nginx 就是定制需要的基礎鏡像。后續的操作都是基于 nginx。
RUN:用于執行后面跟著的命令行命令。有以下倆種格式:
shell 格式:
RUN <命令行命令> # <命令行命令> 等同于,在終端操作的 shell 命令。
exec 格式:
RUN ["可執行文件", "參數1", "參數2"] # 例如: # RUN ["./test.php", "dev", "offline"] 等價于 RUN ./test.php dev offline
注意:Dockerfile 的指令每執行一次都會在 docker 上新建一層。所以過多無意義的層,會造成鏡像膨脹過大。例如:
FROM centos RUN yum install wget RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" RUN tar -xvf redis.tar.gz
以上執行會創建 3 層鏡像??珊喕癁橐韵赂袷剑?/p>
FROM centos RUN yum install wget \ && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \ && tar -xvf redis.tar.gz
如上,以 && 符號連接命令,這樣執行后,只會創建 1 層鏡像。
開始構建鏡像
在 Dockerfile 文件的存放目錄下,執行構建動作。
以下示例,通過目錄下的 Dockerfile 構建一個 nginx:v3(鏡像名稱:鏡像標簽)。
$ docker build -t nginx:v3 .
三、其他命令詳解
1:ENV
設置環境變量,定義了環境變量,那么在后續的指令中,就可以使用這個環境變量。
格式:
ENV
以下示例設置 NODE_VERSION = 7.2.0 , 在后續的指令中可以通過$NODE_VERSION 引用:
ENV NODE_VERSION 7.2.0 RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \ && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"
2:COPY
復制指令,從上下文目錄中復制文件或者目錄到容器里指定路徑。
格式:
COPY [--chown=
[–chown=
<源路徑>:源文件或者源目錄,這里可以是通配符表達式,其通配符規則要滿足 Go 的 filepath.Match 規則。例如:
COPY hom* /mydir/ COPY hom?.txt /mydir/
<目標路徑>:容器內的指定路徑,該路徑不用事先建好,路徑不存在的話,會自動創建。
3:ADD
格式:ADD
ADD
示例:
ADD hom* /mydir/ # 添加所有以"hom"開頭的文件 ADD hom?.txt /mydir/ # ? 替代一個單字符,例如:"home.txt" ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
4:EXPOSE
格式:
EXPOSE
示例:
EXPOSE 80 443 EXPOSE 8080 EXPOSE 11211/tcp 11211/udp
注:EXPOSE并不會讓容器的端口訪問到主機。要使其可訪問,需要在docker run運行容器時通過-p來發布這些端口,或通過-P參數來發布EXPOSE導出的所有端口
5:USER
格式:
USER user USER user:group USER uid USER uid:gid USER user:gid USER uid:group
示例:
USER www
注:使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構建完成后,通過docker run運行容器時,可以通過-u參數來覆蓋所指定的用戶。
6:WORKDIR
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (這時工作目錄為/a) WORKDIR b (這時工作目錄為/a/b) WORKDIR c (這時工作目錄為/a/b/c)
注:通過WORKDIR設置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執行。在使用docker run運行容器時,可以通過-w參數覆蓋構建時所設置的工作目錄。
7:RUN
RUN用于在鏡像容器中執行命令,其有以下兩種命令執行方式:
7.1 shell執行
格式:
RUN
7.2 exec執行
格式:
RUN ["executable", "param1", "param2"]
示例:
RUN ["executable", "param1", "param2"] RUN apk update RUN ["/etc/execfile", "arg1", "arg1"]
注:RUN指令創建的中間鏡像會被緩存,并會在下次構建中使用。如果不想使用這些緩存鏡像,可以在構建時指定–no-cache參數,如:docker build --no-cache
8:CMD
格式:
CMD ["executable","param1","param2"] (執行可執行文件,優先) CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數) CMD command param1 param2 (執行shell內部命令)
示例:
CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"]
注:CMD不同于RUN,CMD用于指定在容器啟動時所要執行的命令,而RUN用于指定鏡像構建時所要執行的命令。
9:ENTRYPOINT
格式:
ENTRYPOINT ["executable", "param1", "param2"] (可執行文件, 優先) ENTRYPOINT command param1 param2 (shell內部命令)
示例:
FROM ubuntu ENTRYPOINT ["top", "-b"] CMD ["-c"]
注:ENTRYPOINT與CMD非常類似,不同的是通過docker run執行的命令不會覆蓋ENTRYPOINT,而docker run命令中指定的任何參數,都會被當做參數再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設置,而只執行最后的ENTRYPOINT指令。
Docker Nginx
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。