1 介紹
Dockerfile是由一系列命令和參數(shù)構(gòu)成的腳本
2 注意事項(xiàng)
Dockerfile中所用的文件要和Dockerfile文件在同一級(jí)父目錄下(子目錄中也可)
3 常用命令
| 命令 |
作用 |
| FROM |
定義基礎(chǔ)鏡像 |
| MAINTAINER |
鏡像的創(chuàng)建者 |
| ENV |
設(shè)置環(huán)境變量 |
| CMD |
類似于 RUN 指令,用于運(yùn)行程序 |
| RUN |
對(duì)鏡像進(jìn)行處理 |
| ADD |
將宿主機(jī)文件復(fù)制倒容器中,壓縮文件會(huì)自動(dòng)解壓 |
| COPY |
將宿主機(jī)文件復(fù)制到容器中 |
| WORKDIR |
工作目錄 |
4 詳解
4.1 COPY
復(fù)制指令,從上下文目錄中復(fù)制文件或者目錄到容器里指定路徑
COPY jdk1.8.0_191.tar.gz /usr/local/gp6/java
格式
COPY [--chown=<user>:<group>] <源路徑1> <目標(biāo)路徑>
COPY [--chown=<user>:<group>] ["<源路徑1>","<源路徑2>"...... "<目標(biāo)路徑>"]
[--chown=<user>:<group>]
可選參數(shù),用戶改變復(fù)制到容器內(nèi)文件的擁有者和屬組
<源路徑>
源文件或者源目錄,這里可以是通配符表達(dá)式,其通配符規(guī)則要滿足 Go 的 filepath.Match 規(guī)則;例如:
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目標(biāo)路徑>
容器內(nèi)的指定路徑,該路徑不用事先建好,路徑不存在的話,會(huì)自動(dòng)創(chuàng)建;
樣例
# 添加壓縮包
COPY jdk1.8.0_191.tar.gz /usr/local/gp6/java
4.2 ADD
ADD 指令和 COPY 的使用格式一致(同樣需求下,推薦使用 COPY)
功能也類似,不同之處如下
ADD 的優(yōu)點(diǎn):在執(zhí)行 <源文件> 為 tar 壓縮文件(格式為 gzip, bzip2 ,xz ),會(huì)自動(dòng)解壓到 <目標(biāo)路徑>
ADD 的缺點(diǎn):在不解壓的前提下,無法復(fù)制 tar 壓縮文件;會(huì)令鏡像構(gòu)建緩存失效,從而可能會(huì)令鏡像構(gòu)建變得比較緩慢;具體是否使用,可以根據(jù)是否需要自動(dòng)解壓來決定;
樣例
# 添加壓縮包
ADD jdk1.8.0_191.tar.gz /usr/local/gp6/java
4.3 CMD
類似于 RUN 指令,用于運(yùn)行程序,二者運(yùn)行的時(shí)間點(diǎn)不同
CMD 在docker run 時(shí)運(yùn)行;
RUN 是在 docker build;
作用
為啟動(dòng)的容器指定要運(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í)行過程比較明確;第一種格式實(shí)際上在運(yùn)行的過程中也會(huì)自動(dòng)轉(zhuǎn)換成第二種格式運(yùn)行,并且默認(rèn)可執(zhí)行文件是 sh;
樣例
[root@localhost gp6]# docker build -t test-cmd .
Sending build context to Docker daemon 2.56kB
Step 1/3 : FROM centos:7
---> 5e35e350aded
Step 2/3 : MAINTAINER "GP6"
---> Running in 7520e3e19089
Removing intermediate container 7520e3e19089
---> 4ef65ed7526b
Step 3/3 : CMD ["/bin/echo", "this is a CMD test"]
---> Running in 5e44bbe2c83d
Removing intermediate container 5e44bbe2c83d
---> efff18a16e96
Successfully built efff18a16e96
Successfully tagged test-cmd:latest
[root@localhost gp6]# docker run test-cmd
this is a CMD test
4.4 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>",...]
可以搭配 CMD 命令使用
一般是變參才會(huì)使用 CMD ,這里的 CMD 等于是在給 ENTRYPOINT 傳參;
示例:
假設(shè)已通過 Dockerfile 構(gòu)建了 nginx:test 鏡像:
FROM nginx
ENTRYPOINT ["nginx", "-c"] # 定參
CMD ["/etc/nginx/nginx.conf"] # 變參
不傳參運(yùn)行
$ docker run nginx:test
容器內(nèi)會(huì)默認(rèn)運(yùn)行以下命令,啟動(dòng)主進(jìn)程;
nginx -c /etc/nginx/nginx.conf
傳參運(yùn)行
$ docker run nginx:test -c /etc/nginx/new.conf
容器內(nèi)會(huì)默認(rèn)運(yùn)行以下命令,啟動(dòng)主進(jìn)程(/etc/nginx/new.conf:假設(shè)容器內(nèi)已有此文件)
nginx -c /etc/nginx/new.conf
4.5 ENV
設(shè)置環(huán)境變量,定義了環(huán)境變量,那么在后續(xù)的指令中,就可以使用這個(gè)環(huán)境變量。
格式:
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
設(shè)置JAVA變量
# 設(shè)置環(huán)境變量
ENV JAVA_HOME /usr/local/gp6/java/jdk1.8.0_191
ENV JRE_HOME $JAVA_HOME/jre
ENV PATH $JAVA_HOME/bin:$PATH