Dockerfile 指令详解

1、COPY指令(复制文件)

格式:
        COPY [--chown=<user>:<group>] <源路径>... <目标路径>
        COPY[--chown=<user>:<group>]["<源路径1>",... "<目标路径>"]
用法:
		1、在命令行使用
		2、函数调用
说明:
	  1、COPY指令将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置
	  2、源路径可以是多个,也可以是通配符
	  3、目标路径可以是绝对路径,也可以是相对路径
	  4、--chown=<user>:<group> 选项来改变文件的所属用户及所属组
示例:
	  1、COPY --chown=55:mygroup files* /mydir/
      2、COPY --chown=bin files* /mydir/
	  3、COPY --chown=1 files* /mydir/
	  4、COPY --chown=10:11 files* /mydir/

ADD指令(更高级的复制文件)

格式:
	ADD [--chown=<user>:<group>] <源路径>... <目标路径>
    ADD [--chown=<user>:<group>] ["<源路径1>",... "<目标路径>"]
用法:
	1、在命令行使用
	2、函数调用
说明:
	1、和COPY命令相同,但增加了一些特殊用法
	2、<源路径>可以是一个url,docker引擎会试图下url路径文件放到目标路径中
	3、碰见压缩文件会解压
示例:
	1、ADD --chown=55:mygroup files* /mydir/
	2、ADD --chown=bin files* /mydir/
	3、ADD --chown=1 files* /mydir/
	4、ADD --chown=10:11 files* /mydir/

CMD指令(容器启动命令)

格式:
	shell 格式:CMD <命令>
	exec 格式:CMD ["可执行文件", "参数1", "参数2"...]
	参数列表格式:CMD ["参数1", "参数2"...]
用法:
	CMD命令就是指定默认的容器主进程的启动命令的
说明:
	1、在运行时可以指定新的命令来替代镜像设置中的这个默认命令
		例:docker run -it ubuntu 会直接进入bash
			   docker run -it cat /etc/os-release 会输出系统版本信息
	2、exec格式在解析时会被解析为json数组,因此一定要使用双引号,不要使用单引号
	3、容器内没有前后台服务的概念,都是以前台运行的
示例:
	1、CMD echo $HOME
	2、CMD ["nginx", "-g", "daemon off;"]

ENTRYPOINT 指令(入口点)

格式:
	exec格式:
	shell格式:
用法:
	<ENTRYPOINT> "<CMD>"
说明:
	1、指定容启动程序及参数
	2、指定了ENTRYPOINT后cmd的含义会发生改变,不再直接运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令
示例:
	1、让镜像变成像命令一样使用
		需要一个得知自己当前公网ip的镜像
		docker build -t myip .
		docker run myip -i
	2、应用运行前的准备工作
		FROM alpine:3.4
		...
		RUN addgroup -S redis && adduser -S -G redis redis
		...
		ENTRYPOINT ["docker-entrypoint.sh"]
		EXPOSE 6379
		CMD [ "redis-server" ]

ENV指令(设置环境变量)

格式:
	ENV <key><value>
	ENV<key1>=<value1> <key2>=<value2>
用法:
	定义环境变量
说明:
	通过环境变量,我们可以让一份 Dockerfile 制作更多的镜像,只需使用不同的环境变量即可。
示例:
	ENV VERSION=1.0 DEBUG=on \
		  NAME="Happy Feet"

ARG指令(构建参数)

格式:
	ARG <参数名>[=<默认值>]
用法:
说明:
	用法和ENV指令效果一样,都是设置环境变量,但是ARG设置的环境变量,在将来容器运行时是不会保存这些环境变量的
示例:

VOLUME指令(定义匿名卷)

格式:
	VOLUME ["<路径1>","<路径2>",.....]
	VOLUME <路径>
用法:
说明:
	对于数据库等需要保存动态数据的应用,其数据库文件应保存于卷(volume中)
示例:
	VOLUME /data

EXPOSE指令(暴露端口)

格式:
	EXPOSE <端口1> [<端口2>.....]
用法:
说明:
	声明运行容器时提供服务端口,只是声明,在运行时并不会因为声明就会开启此端口服务
示例

WORKDIR指令(指定工作目录)

格式:
	WORKDIR <工作目录路径>
用法:
	使用WORKDIR指定工作目录,以后各层的当前目录就被改为指定目录,如该目录不存在,WORKDIR会帮你建立目录
说明:
示例:

USER指令(指定当前用户)

格式:
	USER <用户名>[:<用户组>]
用法:
	USER和WORKDIR相似,都是改变环境状态并影响以后的层,WORKDIR是改变工作目录,USER是改变之后的执行层
说明:
	只是帮切换用户,此用户必须事先建立好,否则无法切换
示例:

HEALTHCHECK指令(健康检查)

格式:
	HEALTHCHECK [选项] CMD <命令> 设置检查容器健康状况的命令
	HEALTHCHECK NONE 如果基础镜像有健康检查指令,那么这行可以屏蔽掉其健康检查指令
用法:
	--interval=<间隔>:两次健康检查的间隔,默认为 30 秒;
	--timeout=<时长>:健康检查命令运行超时时间,如果超过这个时间,本次健康检查就被视为失败,默认 30 秒;
	--retries=<次数>:当连续失败指定次数后,则将容器状态视为 unhealthy,默认 3 次。
说明:
	HEALTHCHECK是告诉docker应该如何判断容器的状态是否正常
示例:

ONBUILD指令(为他人做嫁衣)

格式:
	ONBUILD <其他指令>
用法:
说明:
	1、ONBUILD指令是一个特殊指令,它后面跟其他指令,比如COPY,RUN,而这些指令,在当前镜像构建时并不会被执行,只有当以前镜像为基础镜像,去构建下一级镜像时才会被执行。