COPY 復(fù)制文件
和RUN一樣顽决,COPY也有2中格式饺藤,一種是命令行阱飘,一種類似于函數(shù)調(diào)用
- COPY <源路徑>...<目標(biāo)路徑>
- COPY ["<源路徑>"..."<目標(biāo)路徑>"]
COPY指令將從構(gòu)建上下文目錄中(源路徑)復(fù)制到新的鏡像中的(目標(biāo)路徑)斥杜,源路徑可以是多個,也可以是通配符
FROM centos
COPY mydockerfile /home
ADD更高級的復(fù)制文件
ADD和COPY類似沥匈,但是ADD多了一些功能蔗喂,比如源路徑可以是url,ADD會下載該文件高帖,并設(shè)置為600權(quán)限缰儿,如果文件是壓縮文件,ADD會自動解壓散址。官方并不推薦使用該方法乖阵,可以通過COPY和RUN結(jié)合實現(xiàn)ADD方法
CMD容器啟動命令
和RUN一樣,CMD也有2中格式
- shell格式:CMD <命令>
- exec格式:CMD ["可執(zhí)行文件","參數(shù)1","參數(shù)2"....]
- 參數(shù)列表格式:CMD ["參數(shù)1","參數(shù)2"....]
因為docker不是虛擬機预麸,是容器瞪浸,而容器中的應(yīng)用都應(yīng)該以前臺執(zhí)行,而不是像虛擬機吏祸、物理機使用init啟動服務(wù)在后臺運行默终,容器沒有后臺的概念。當(dāng)CMD service nginx start的時候犁罩,因為是在后臺運行齐蔽,當(dāng)該命令運行完,容器也退出了床估。所以在前面制作nginx鏡像的時候nginx使用daemon off將nginx在前臺運行含滴。
==一個Dockerfile文件中只能有一個CMD,如果有多條丐巫,只有最后一條會被執(zhí)行==
FROM ....
RUN ....
CMD ["nginx","-g","daemon off;"]
ENTRYPOINT 入口點
和CMD一樣谈况,也有shell和exec兩種格式
ENTRYPOIN和CMD目的一樣勺美,都是指定容器啟動程序及參數(shù)。不同點就是當(dāng)設(shè)置了ENTRYPOINT后運行容器時可以傳遞參數(shù)
示例:給CMD命令傳參
FROM centos
ENTRYPOINT ["curl","http://ip.cn"]
如果ENTRYPOINT換成CMD碑韵,則只能獲取ip對應(yīng)地址赡茸。如果需要獲取頭信息,CMD則不行祝闻。需要給curl傳-i參數(shù)占卧。ENTRYPOINT則可以實現(xiàn)
[root@localhost ~]# docker run -it --rm centos_curl -i
HTTP/1.1 200 OK
Server: nginx/1.11.3
Date: Fri, 10 Feb 2017 03:43:03 GMT
Content-Type: text/html; charset=UTF-8
Transfer-Encoding: chunked
Connection: keep-alive
當(dāng)前 IP:xxx.xxx.xxx.xxx 來自:xxx市 xxx網(wǎng)
該命令相當(dāng)于把-i參數(shù)添加到了["curl","http://ip.cn"]的最后
ENV 環(huán)境變量
定義環(huán)境變量,無論是docker其他某些指令還是運行時的應(yīng)用联喘,都可以使用這里的環(huán)境變量华蜒,支持環(huán)境變量的指令:ADD、COPY豁遭、ENV叭喜、EXPOSE、LABEL蓖谢、USER捂蕴、WORKDIR、VOLUME闪幽、STOPSIGNAL啥辨、ONBUILD
- ENV <key> <value>
- ENV <key1>=<value1> <key2>=<value2>
示例
FROM centos
ENV VERSION=1.10
RUN yum install nginx-$VERSION -y
...
ARG 構(gòu)建參數(shù)
和ENV一樣,都是設(shè)置環(huán)境變量沟使,不同的是ARG設(shè)置的是構(gòu)建環(huán)境的環(huán)境變量渊跋,在容器運行時不會存在這些環(huán)境變量
格式: ARG <參數(shù)名>[=<默認(rèn)值>]
VOLUME 定義匿名卷
docker會在主機上創(chuàng)建一個目錄腊嗡,默認(rèn)在/var/lib/docker下燕少,然后將其掛在到指定的路徑蒿囤,當(dāng)刪除使用該volume的容器時,VOLUME本身不受影響底挫,可以一直保存下去脸侥,對主機的/var/lib/docker目錄的操作,會同步到掛在該目錄的容器中去
- VOLUME ["<路徑1>","<路徑2>"...]
- VOLUME <路徑>
也可以在執(zhí)行run的時候掛載
docker run -v /data centos
-
docker run -v /opt/data:/data centos
將主機上/opt/data目錄掛載到容器的/data目錄
EXPOSE 端口聲明]
聲明運行時容器應(yīng)用所提供的端口官边,只是一個聲明,運行時不會開啟這個端口注簿。好處是:一在Dockerfile中寫入容易理解該鏡像服務(wù)的守護(hù)端口,方便配置映射捐晶。二在運行時使用隨機端口映射時(docker run -P),會自動隨機映射EXPOSE的端口
EXPOSE <端口1> [<端口2>...]
WORKDIR 指定工作目錄
WORKDIR指定當(dāng)前工作目錄
WORKDIR <工作目錄路徑>
FROM centos
WORKDIR /opt
RUN xxxx
該RUN命令在/opt目錄下運行
FROM centos
WORKDIR /opt
WORKDIR a
WORKDIR b
RUN xxxx
該RUN命令在/opt/a/b目錄下運行
USER 指定當(dāng)前用戶
和WORKDIR類似租悄,為后面RUN泣棋、CMD、ENTRYPOINT等命令指定運行用戶潭辈,如果鏡像中沒有該用戶會報錯
FROM centos
RUN useradd www /sbin/nologin
USER www
CMD ["whoami"]
ONBUILD
Dockerfile中指令都是工作于當(dāng)前鏡像把敢,而ONBUILD是下一鏡像以該鏡像為基礎(chǔ)鏡像是才會執(zhí)行谅辣。當(dāng)該鏡像作為基礎(chǔ)鏡像,基礎(chǔ)鏡像變化后柏副,其他項目用這個Dockerfile重構(gòu)鏡像會繼承這個基礎(chǔ)鏡像
ONBUILD 其他指令
示例:
FROM centos
RUN yum install nginx -y
USER www
ONBUILD COPY nginx.conf /etc/nginx
CMD ["nginx","-g","daemon off"]
將該Dockerfile構(gòu)建成nginx_centos鏡像
FROM nginx_centos
只需要這一行割择,即可運行上一個Dockerfile中的命令
應(yīng)用場景:當(dāng)有多個項目使用該鏡像時萎河,要修改某一配置,就不需要對每一個鏡像修改玛歌,直接修改基礎(chǔ)鏡像擎椰,其他鏡像即可繼承該鏡像