Dockerfile 介紹
它是一個文本文件,鏡像文件構(gòu)建腳本
由一些列用于根據(jù)基礎(chǔ)鏡像構(gòu)建新的鏡像文件的專用指令序列組成
Dockerfile command
- ADD
- COPY
- ENV
- EXPOSE
- FROM
- MAINTANIER
- LABEL
- STOPSIGNAL
- USER
- VOLUME
- WORKDIR
FROM
必須是第一個非注釋行,用于指定所用到的基礎(chǔ)鏡像
語法格式
- FROM <image>[:<tag>]
- FROM <image>@<digest>
注意: 盡量不要在一個dockerfile中使用多個FROM指令
MAINTANIER
用于提供信息的指令粥航,用于讓作者提供本人的信息
建議緊跟在FROM以后危队,不限制出現(xiàn)的位置
語法格式
MAINTANIER <authors detail>
COPY
用于docker主機(jī)復(fù)制文件指向正在創(chuàng)建的映像文件中
語法格式
- COPY SRC DEST
- COPY "SRC"... "DEST"
解釋
- src: 要復(fù)制的源文件或目錄,支持使用通配符
- dest: 目錄路徑,正在創(chuàng)建的鏡像文件的文件系統(tǒng)路徑,建議使用絕對路徑,否則,則相對于WORKDIR而言,所有復(fù)制生成的目錄文件的uid和gid均為0
注意
- src 必須是build上下文中的路徑,因此不能使用類似"../some"的路徑
- src 如果是目錄,遞歸復(fù)制會自動行,如果有多個src ,包括src上使用了通配符這種情況,此時,dest必須是目錄,而且必須以/結(jié)尾
- dest 如果事先不存在,它將被自動創(chuàng)建,包括其父目錄
ADD
類似于COPY指令,額外還支持復(fù)制tar文件,以及URL語法
語法格式
- ADD SRC DEST
- ADD "SRC" ... "DEST"
注意
- 以url格式指定的源文件,下載完成后其目標(biāo)文件的權(quán)限為600
- 如果src是url,且dest不以/結(jié)尾,則src指定的文件將被下載并直接被創(chuàng)建為dest, 如果dest以/結(jié)尾,則url指定的文件被下載至dest中,并保留原名
- 如果src是一個tar文件,它將被展開為一個目錄,其行為類似于tar -x 命令,但是如果通過url下載到的文件是tag格式的,是不會自動被展開的
ENV
定義環(huán)境變量,此變量可被當(dāng)前dockerfile文件中的其它指令調(diào)用
調(diào)用格式為$varaible_name或者${variable_name}
語法格式
- ENV <key> <value> 一次定義一個變量
- ENV <key>=<value> ... 一次定義多個變量 如果value中有空白字符,如要用\字符進(jìn)行轉(zhuǎn)義
注意
- ENV 定義的環(huán)境變量在鏡像運(yùn)行的整個過程中一直存在
- 因此可以使用inspect命令查看,甚至可以再docker run啟動此鏡像時候,使用--env選項來修改制定的環(huán)境值
USER
指定運(yùn)行鏡像時候, 或運(yùn)行Dockerfile文件中的任何RUN,CMD,/ENTRYPORINT指定的程序時的用戶名或者UID
語法格式
- USER <uid>|<USERNAME>
注意
- UID 應(yīng)該使用/etc/passwd 文件存在的用戶的UID,否則,docker run可能會出現(xiàn)錯誤
WORKDIR
用于為Dockerfile中所有的指令指定工作目錄
語法格式
- WORKDIR <dirpath>
注意
- WORKDIR 可出現(xiàn)多次,也可使用相對路徑,此時表示相對于前一個WORKDIR指令指定的路徑
- WORKDIR 還可以調(diào)用ENV定義的環(huán)境變量的值
VOLUME
用于目標(biāo)鏡像文件中創(chuàng)建一個掛載點(diǎn)的目錄,用于掛載主機(jī)上的卷或者其它容器的卷
語法格式
- VOLUME <mountpoint>
- VOLUME ["<mountpoint>" .... ]
RUN
于指定docker build命令過程中運(yùn)行的命令
語法格式
- RUN <COMMAND>
- RUN ["executeable" ,"<param1>" ,"<param2>" ]
注意
- 每個run命令就額外加一層,所以建議一個RUN指令執(zhí)行多個命令
CMD
類似于RUN指令,用于運(yùn)行程序,但二者運(yùn)行的是場景不同
CMD在docker run時運(yùn)行而非docker build,CMD指令的首
要目的為了在于為啟動的容器指定默認(rèn)要運(yùn)行的程序程序
運(yùn)行結(jié)束, 容器也就結(jié)束,不過,CMD指令指定的程序可被
docker run命令行參數(shù)中執(zhí)行的要運(yùn)行的程序所覆蓋
語法格式
- CMD <COMMAND>
- CMD ["executeable" ,"<param1>" ,"<param2>" ]
- CMD ["<para1>","<param2>"]
注意
- 第三種為ENTRYPOINT指令指定的程序的默認(rèn)參數(shù)
- 如果dockefile中存在多個CMD指令,只會最后一個生效
ENTRYPOINT
類似于CMD,為容器指定默認(rèn)的啟動程序,不會被docker run
所運(yùn)行的程序所覆蓋.而且這些命令行參數(shù),會被當(dāng)作參數(shù)送
給ENTRYPOINT指令指定的程序但是如果運(yùn)行docker run時,
使用了 --entrypoint選項,此選項的參數(shù)可當(dāng)作要運(yùn)行的程序覆蓋
ENTRYPOINT指令指定的程序
語法格式
- ENTRYPOINT <COMMAND>
- ENTRYPOINT ["executeable" ,"<param1>" ,"<param2>" ]
EXPOSE
用于為容器指定要暴露的端口
語法格式
- EXPOSE <PORT>[/<PROTOCAL>] [<PROT></PROTOCAL>]
- PROTOCAL: 默認(rèn)為tcp,可以是tcp或者udp
例如 eg:
- EXPOSE 11211/tcp 11211/udp
ONBUILD
定義觸發(fā)器
當(dāng)前dockerfile構(gòu)建出的鏡像被用作基礎(chǔ)鏡像,去構(gòu)建其他鏡像的時候,ONBUILD指令指定的操作才會被執(zhí)行
語法格式
- ONBUILD <instruction>
- ONBUILD ADD my.conf /etc/mysql/my.conf
注意
ONBUILD不能自我嵌套,且不會觸發(fā)FROM和MAINTERNATER指令
docker command
docker build -t bdshello . #創(chuàng)建image鏡像構(gòu)建Dockerfile
docker run -p 4000:80 bdshello #啟動bdshello容器 映射端口
docker run -d -p 4000:80 bdshello #后臺啟動
docker container ls #顯示所有啟動的容器
docker container ls -a #顯示所有容器包括不啟動的
docker container stop <hash id> #優(yōu)雅停止容器
docker container kill <hash id> #強(qiáng)制停止容器
docker container rm <hash id> #移除容器
docker container rm $(docker container ls -a -q) #移除所有容器
docker image ls -a #列出所有鏡像
docker image rm <image id> #刪除鏡像
docker image rm $(docker image ls -a -q) #刪除所有鏡像