Dockerfile結(jié)構(gòu)
通常dockfile包含4部分
- 基礎(chǔ)鏡像
- 維護(hù)者信息
- 鏡像操作指令
- 容器啟動時執(zhí)行指令
dockerfile示例
?#這是一個示例
?#基于ubuntu image
?#version 2
?#author:me
?#command format: Instruction [arg/command]
?
?#第一行必須是指定的基礎(chǔ)鏡像
?FROM ubuntu
?
?#維護(hù)者信息,名稱和信箱
?MAINTAINER dockeruser docker@docker.com
?
?#鏡像的操作指令,每執(zhí)行一次run指令,鏡像就添加一層
?RUN echo “deb http://archive.ubuntu.com/ubuntu/ raring main universe ” >>/etc/apt/ources.list
?RUN apt-get update && apt-get install -y nginx
?
?#容器啟動時執(zhí)行的指令
?CMD /usr/sbin/nginx
操作指令
1.FROM
?FROM image,引出基礎(chǔ)鏡像。一個dockerfile可以引入多個基礎(chǔ)鏡像。
2.MAINTAINER
?MAINTAINER <name>指定維護(hù)者信息
3.RUN
?RUN <command> 在shell終端中運行命令,即/bin/sh -C
?RUN["executable","param1","param2"] 使用exec執(zhí)行。
?命令較長時,可以使用\換行
4.CMD
?指定容器啟動時執(zhí)行的命令,每個dockerfile只能有1條CMD命令,多個CMD只會執(zhí)行最后一條。容器啟動時,指定了運行命令,則會覆蓋到dockerfile里的CMD命令。
?* CMD ["executable","para1","para2"]使用exec執(zhí)行,推薦使用。
?* CMD command para1 para2 在/bin/sh中執(zhí)行,提供給需要交互的應(yīng)用。
?* CMD ["para1","para2"]提供給ENTRYPOINT的默認(rèn)參數(shù)。
5.EXPOSE
?EXPOSE<port> [<port>]指定暴露給主機(jī)的端口。
6.ENV
?ENV <key> <value>指定環(huán)境變量,后續(xù)的run指令使用,并在容器運行期間保持
7.ADD
?ADD <src> <dest>將src指定目錄或url的文件或目錄,復(fù)制到容器的dest
8.COPY
?COPY <src> <dest>對于dockerfile所在目錄現(xiàn)對路徑文件或目錄,復(fù)制到容器的dest,dest不存在會自動創(chuàng)建。
9.ENTRYPOINT
? 配置容器啟動后執(zhí)行的命令,不能被docker run提供的參數(shù)覆蓋。每個dockerfile只能有一個ENTRYPOINT,多個ENTRYPOINT只有最后一個生效。
?ENTRYPOINT ["executable","para1","para2"]
?ENTRYPOINT command para1 para2(在shell中執(zhí)行)。
10.VOLUME
? VOLUME [“/data”] 創(chuàng)建一個可以從宿主機(jī)或其他容器掛載的掛載點。
11.USER
?USER daemon指定容器運行時的用戶名或uid,也可以在RUN時指定用戶
12.WORKDIR
?WORKDIR /path/to/workdir 為后續(xù)的RUN、CMD、ENTRYPOINT指定配置工作目錄,可以使用多個WORKDIR指令,后續(xù)命令如果參數(shù)是相對目錄,則會基于之前命令的路徑。
13.ONBUILD
?配置從當(dāng)前鏡像創(chuàng)建其他鏡像時,執(zhí)行的指令
創(chuàng)建鏡像
docker build
?編寫為dockerfile后,通過該命令來創(chuàng)建鏡像。docker build [option] path 讀取指定路徑下(含子目錄)的dockerfile,并將該路徑下所有內(nèi)容發(fā)送給docker服務(wù)端,有服務(wù)端來創(chuàng)建鏡像,因此一般建議防止dockerfile的目錄為空目錄。