Dockerfile 樣本
FROM nginx:v1
MAINTAINER east_qiu@outlook.com
WORKDIR /usr/share/nginx/html
RUN echo '<h1>Hello, Docker!</h1>' > index.html
EXPOSE ['80', '443']
...
- 構(gòu)建鏡像
docker build nginx .
-f 指定具體的dockerfile
-t 指定鏡像的tag忍些,指定存儲(chǔ)庫(kù)和標(biāo)記保存新映像骄噪,可以一次指定多個(gè)tag,生成多個(gè)鏡像
docker build -t shykes/myapp:1.0.2 -t shykes/myapp:latest .
構(gòu)建時(shí)docker會(huì)初步驗(yàn)證dockerfile样漆,如果有語(yǔ)法錯(cuò)誤摊阀,會(huì)提示
dockerfile每條指令都是獨(dú)立運(yùn)行的,并會(huì)創(chuàng)建一個(gè)新映像
Docker將重用中間映像(緩存),顯著加快Docker構(gòu)建過(guò)程绣版。
dockerfile 必須從FROM開始
FROM
FROM 基礎(chǔ)鏡像
escape
escape指令用于指定dockerfile里面的轉(zhuǎn)義字符胶台, 默認(rèn)是 \ , windows里面 `
escape定義在文件的最上方
# escape=`
FROM microsoft/nanoserver
COPY testfile.txt c:\
RUN dir c:\
ENV
ENV定義的環(huán)境變量在后續(xù)層次中才能夠被應(yīng)用
ENV abc=hello
ENV abc=bye def=$abc # def=hello
ENV ghi=$abc # ghi=bye
.dockerignore
COPY和ADD指令中用于忽略指定文件,加快構(gòu)建速度
RUN
RUN <command>
RUN ["executable", "param1", "param2"]
linux 上默認(rèn)上/bin/sh -c
windows上默認(rèn)cmd /S /C
RUN命令在當(dāng)前鏡像上執(zhí)行指令杂抽,構(gòu)建出一個(gè)新的鏡像诈唬,便于dockerfile下面的語(yǔ)句繼續(xù)執(zhí)行
RUN可以有多個(gè)
CMD
CMD一個(gè)dockerfile里只能有一個(gè)
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
如果指定ENTERPOINT, 用 CMD 指定具體的參數(shù)缩麸。
這里邊包括參數(shù)的一定要用雙引號(hào)铸磅,就是",不能是單引號(hào)。千萬(wàn)不能寫成單引號(hào)杭朱。
RUN & CMD
RUN是構(gòu)件容器時(shí)就運(yùn)行的命令以及提交運(yùn)行結(jié)果
CMD是容器啟動(dòng)時(shí)執(zhí)行的命令阅仔,在構(gòu)件時(shí)并不運(yùn)行,構(gòu)件時(shí)緊緊指定了這個(gè)命令到底是個(gè)什么樣子
LABEL
label為鏡像指定信息弧械,用于docker inspect 查看相關(guān)信息
MAINTAINER
指定維護(hù)者八酒,已經(jīng)廢棄
EXPOSE
EXPOSE用于指定容器運(yùn)行時(shí)指定對(duì)外暴露的端口
但是EXPOSE并不會(huì)使容器訪問主機(jī)的端口
如果想使得容器與主機(jī)的端口有映射關(guān)系,必須在容器啟動(dòng)的時(shí)候加上 -P參數(shù)
ADD
ADD把文件復(fù)制到鏡像中
ADD --chown=<user>:<group> src dist
chown 只有l(wèi)inux文件系統(tǒng)才有
src可以是文件刃唐,也可以是鏈接羞迷,也可以是目錄(不建議,會(huì)復(fù)制目錄和目錄下的所有文件)
如果文件系統(tǒng)里/etc/passwd or /etc/group 里面沒有chown指定的用戶画饥,構(gòu)建會(huì)出錯(cuò)
- 增加的文件必須在鏡像上下文相對(duì)的目錄下衔瓮,也就是鏡像構(gòu)建上下文的相對(duì)目錄
- 如果是一個(gè)URL,并且沒有結(jié)尾斜杠荒澡,那么從這個(gè)URL下載一個(gè)文件并復(fù)制到dist
COPY
單純的復(fù)制文件报辱,也是相對(duì)構(gòu)建的鏡像上下文
ENTRYPOINT
ENTRYPOINT 的格式和 RUN 指令格式一樣,分為 exec 格式和 shell 格式
exec 形式
ENTRYPOINT [“executable”,”param1”,”param2"]
任何docker run設(shè)置的命令參數(shù)或者CMD指令的命令单山,都將作為ENTRYPOINT 指令的命令參數(shù)碍现,追加到ENTRYPOINT指令之后。
ENTRYPOINT command param1 param2
這種格式禁止追加任何參數(shù)米奸,即CMD指令或docker run后面的參數(shù)都將被忽略昼接。采用shell格式,在容器中執(zhí)行時(shí)悴晰,自動(dòng)調(diào)用shell慢睡。
CMD&&ENTRYPOINT
- CMD可以為ENTRYPOINT提供參數(shù),
ENTRYPOINT本身也可以包含參數(shù)铡溪,但是可以把需要變動(dòng)的參數(shù)寫到CMD里面漂辐,而不需要變動(dòng)的參數(shù)寫到ENTRYPOINT里面; - ENTRYPOINT使用第二種shell方式會(huì)屏蔽掉CMD里面的命令參數(shù)和docker run后面加的命令棕硫。
- 在Dockerfile中髓涯,ENTRYPOINT指定的參數(shù)比運(yùn)行docker run時(shí)指定的參數(shù)更靠前。
- ENTRYPOINT/CMD中不能把一個(gè)有限執(zhí)行的命令加到一個(gè)無(wú)限執(zhí)行的命令后面哈扮。這會(huì)導(dǎo)致后面的有限執(zhí)行的命令無(wú)法執(zhí)行纬纪。因?yàn)闊o(wú)限命令一直在執(zhí)行蚓再,永遠(yuǎn)都無(wú)法執(zhí)行結(jié)束,所以會(huì)導(dǎo)致后面的有限執(zhí)行命令阻塞包各。
- ENTRYPOINT/CMD中最后的一個(gè)命令必須要是無(wú)限執(zhí)行的命令摘仅。
Dockerfile 中的每一行都產(chǎn)生一個(gè)新層;
下列代碼每一行都又一個(gè)獨(dú)立的id问畅,而且下面產(chǎn)生的三層是只讀的娃属,一旦Image被運(yùn)行時(shí),會(huì)產(chǎn)生一個(gè)新層 container 層按声,這一層是可讀可寫的膳犹;
分層的優(yōu)勢(shì)在于,兩個(gè)image可以共享一些層签则,降低了存儲(chǔ)的壓力
FROM alpine:latest
MAINTAINER cc
CMD echo "hello docker"