1论矾、Dockerfile 是一個(gè)用來(lái)構(gòu)建鏡像的文本文件,文本內(nèi)容包含了一條條構(gòu)建鏡像所需的指令和說(shuō)明。
2众旗、Dockerfile解析
#定制的鏡像都是基于 FROM 的鏡像,這里的 nginx 就是定制需要的基礎(chǔ)鏡像趟畏。后續(xù)的操作都是基于 nginx贡歧。
FROM openjdk:8
#發(fā)布者
MAINTAINER 457030599@qq.com
#指定端口
EXPOSE 8080
#指定時(shí)區(qū)
#ENV
#設(shè)置環(huán)境變量,定義了環(huán)境變量赋秀,那么在后續(xù)的指令中利朵,就可以使用這個(gè)環(huán)境變量。
ENV TZ=Asia/Shanghai
#RUN:用于執(zhí)行后面跟著的命令行命令猎莲。
#shell 格式:
#RUN <命令行命令>
# <命令行命令> 等同于绍弟,在終端操作的 shell 命令。
#exec 格式:
#RUN ["可執(zhí)行文件", "參數(shù)1", "參數(shù)2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等價(jià)于 RUN ./test.php dev offline
# Dockerfile 的指令每執(zhí)行一次都會(huì)在 docker 上新建一層著洼。所以過(guò)多無(wú)意義的層樟遣,會(huì)造成鏡像膨脹過(guò)大而叼,以 && 符號(hào)連接命令,這樣執(zhí)行后豹悬,只會(huì)創(chuàng)建 1 層鏡像葵陵。
#修改時(shí)期,創(chuàng)建目錄
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone && mkdir -p /beam-admin
#WORKDIR
#指定工作目錄屿衅。用 WORKDIR 指定的工作目錄埃难,會(huì)在構(gòu)建鏡像的每一層中都存在。(WORKDIR 指定的工作目錄涤久,必須是提前創(chuàng)建好的)涡尘。
#docker build 構(gòu)建鏡像過(guò)程中的,每一個(gè) RUN 命令都是新建的一層响迂。只有通過(guò) WORKDIR 創(chuàng)建的目錄才會(huì)一直存在考抄。
#格式:
#WORKDIR <工作目錄路徑>
#切換到目錄
WORKDIR /beam-admin
#復(fù)制指令,從上下文目錄中復(fù)制文件或者目錄到容器里指定路徑蔗彤。
#復(fù)制到當(dāng)前目錄 ./
#COPY [--chown=<user>:<group>] <源路徑1>... <目標(biāo)路徑>
#COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標(biāo)路徑>"]
#<目標(biāo)路徑>:容器內(nèi)的指定路徑川梅,該路徑不用事先建好,路徑不存在的話然遏,會(huì)自動(dòng)創(chuàng)建贫途。
#ADD 指令和 COPY 的使用格式一致(同樣需求下,官方推薦使用 COPY)待侵。功能也類似丢早,不同之處如下:
#ADD 的優(yōu)點(diǎn):在執(zhí)行 <源文件> 為 tar 壓縮文件的話,壓縮格式為 gzip, bzip2 以及 xz 的情況下秧倾,會(huì)自動(dòng)復(fù)制并解壓到 <目標(biāo)路徑>怨酝。
#ADD 的缺點(diǎn):在不解壓的前提下,無(wú)法復(fù)制 tar 壓縮文件那先。會(huì)令鏡像構(gòu)建緩存失效农猬,從而可能會(huì)令鏡像構(gòu)建變得比較緩慢。具體是否使用售淡,可以根據(jù)是否需要自動(dòng)解壓來(lái)決定斤葱。
copy beam-admin-0.0.1-SNAPSHOT.jar ./beam-admin.jar
#修改jar包時(shí)間
RUN bash -c 'touch beam-admin.jar'
#CMD
#類似于 RUN 指令,用于運(yùn)行程序揖闸,但二者運(yùn)行的時(shí)間點(diǎn)不同:
#CMD 在docker run 時(shí)運(yùn)行苦掘。
#RUN 是在 docker build。
#作用:為啟動(dòng)的容器指定默認(rèn)要運(yùn)行的程序楔壤,程序運(yùn)行結(jié)束鹤啡,容器也就結(jié)束。CMD 指令指定的程序可被 docker run 命令行參數(shù)中指定要運(yùn)行的程序所覆蓋蹲嚣。
#注意:如果 Dockerfile 中如果存在多個(gè) CMD 指令递瑰,僅最后一個(gè)生效祟牲。
#CMD <shell 命令>
#CMD ["<可執(zhí)行文件或命令>","<param1>","<param2>",...]
#CMD ["<param1>","<param2>",...] # 該寫法是為 ENTRYPOINT 指令指定的程序提供默認(rèn)參數(shù)
#推薦使用第二種格式,執(zhí)行過(guò)程比較明確抖部。第一種格式實(shí)際上在運(yùn)行的過(guò)程中也會(huì)自動(dòng)轉(zhuǎn)換成第二種格式運(yùn)行说贝,并且默認(rèn)可執(zhí)行文件是 sh。
#ENTRYPOINT
#類似于 CMD 指令慎颗,但其不會(huì)被 docker run 的命令行參數(shù)指定的指令所覆蓋乡恕,而且這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)送給 ENTRYPOINT 指令指定的程序。
#但是, 如果運(yùn)行 docker run 時(shí)使用了 --entrypoint 選項(xiàng)俯萎,此選項(xiàng)的參數(shù)可當(dāng)作要運(yùn)行的程序覆蓋 ENTRYPOINT 指令指定的程序傲宜。
#優(yōu)點(diǎn):在執(zhí)行 docker run 的時(shí)候可以指定 ENTRYPOINT 運(yùn)行所需的參數(shù)。
#注意:如果 Dockerfile 中如果存在多個(gè) ENTRYPOINT 指令夫啊,僅最后一個(gè)生效函卒。
#格式:
#ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
ENTRYPOINT ["nohup","java","-jar","beam-admin.jar","--spring.profiles.active=prod",">/dev/null","2>&1"]
#ARG
#構(gòu)建參數(shù),與 ENV 作用一至撇眯。不過(guò)作用域不一樣报嵌。ARG 設(shè)置的環(huán)境變量?jī)H對(duì) Dockerfile 內(nèi)有效,也就是說(shuō)只有 docker build 的過(guò)程中有效熊榛,構(gòu)建好的鏡像內(nèi)不存在此環(huán)境變量锚国。
#構(gòu)建命令 docker build 中可以用 --build-arg <參數(shù)名>=<值> 來(lái)覆蓋。
#格式:
#ARG <參數(shù)名>[=<默認(rèn)值>]
#VOLUME
#定義匿名數(shù)據(jù)卷玄坦。在啟動(dòng)容器時(shí)忘記掛載數(shù)據(jù)卷血筑,會(huì)自動(dòng)掛載到匿名卷。
#作用:
#避免重要的數(shù)據(jù)营搅,因容器重啟而丟失云挟,這是非常致命的梆砸。
#避免容器不斷變大转质。
#格式:
#VOLUME ["<路徑1>", "<路徑2>"...]
#VOLUME <路徑>
#在啟動(dòng)容器 docker run 的時(shí)候,我們可以通過(guò) -v 參數(shù)修改掛載點(diǎn)帖世。