目录
# Description: test image
FROM busy:latest
LABEL maintainer=”Magedu <mage@magedu.com>”
ENV DOC_ROOT=/data/web/html/ \
WEB_SERVER_PACKAGE=”nginx-1.15.2.tar.gz”
COPY index.html ${DOC_ROOT:- /data/web/html/}
COPY yum.repos.d /etc/yum.repos.d/
ADD http://nginx.org/download/${WEB_SERVER_PACKAGE} /usr/local/src
WORKDIR /usr/local/
VOLUME /data/mysql/
EXPOSE 80/tcp
RUN cd /usr/local/src && \
Tar -x ${WEB_SERVER_PACKAGE}
CMD [“/usr/sbin/nginx”,”-g”,”daemon off;”]
ENTRYPOINT [“/bin/entrypoint.txt.sh”]
HEALTHCHECK --start-period=3s CMD wget -o - -q http://${IP:-0.0.0.0}:8080/
echo ${name:-tom} 如果name值为空,则赋值tom;如果不为空,则显示原值
echo ${name:+tom} 如果name值为空,则不显示; 如果不为空,则赋值tom
FROM
Doeckerfile文件开篇的第一个非注释行
格式:
FROM <repository>[:<tag>] 或 FROM <repository>@<镜像ID>
<repository>:指定作为base image的名称
<tag>:base image的标签,省略时默认为latest
COPY
用于从docker宿主机复制文件至创建的新映像文件
格式:
COPY <src> ... <dest> 或 COPY ["<src>",... "<dest>"]
<src>:要复制的源文件或目录,支持使用通配符
<dest>:目标路径,即正在创建的image的文件系统路径;建议<dest>使用绝对路径,否则,copy指定则以WORKDIR为其起始路径;
注意:在路径中有空白字符时,通常使用第二种格式
文件复制准则:
<src>必须是build上下文中的路径,不能是其父目录的文件
如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录自身不会被复制
ADD
ADD指令类似于COPY指令,ADD支持使用TAR文件和URL路径
格式:
ADD <src> ... <dest> 或 ADD ["<src>",... "<dest>"]
操作准则:
如果<src>是一个本地系统上的压缩格式的tar文件,它将被展开为一个目录,其行为类似于“tar -x”命令;然而,通过URL获取到的tar文件将不会自动展开
WORKDIR
用于为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY和ADD指定工作目录
格式:
WORKDIR <dirpath>
VOLUME
用于在image中创建一个挂载点目录,以挂载Docker host上的卷或其它容器上的卷
只能使用docker manage的卷
格式:
VOLUME <mountpoint> 或 VOLUME [“<mountpoint>”]
EXPOSE
用于为容器打开指定要监听的端口以实现与外部通信
格式:
EXPOSE <PORT>[/<protocol>] [<PORT>[/<protocol>] ...]
<protocol>:用于指定传输层协议,可为tcp或udp二者之一,默认为TCP协议
EXPOSE指令可一次指定多个端口
ENV
用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其他指令所调用
调用格式为$variable_name或{variable_name}
格式:
ENV <key> <value> 或 ENV <key>=<value>
第一种格式,<key>之后的所有内容均会被视作其<value>的组成部分,因此,一次只能设置一个变量;
第二种格式可用一次设置多个变量,如果<value>中包含空格,可用(\)转义,也可以加引号;另外,反斜线也可用于续行
RUN
用于指定docker build过程中运行的程序,其可以是任何命令
格式:
RUN <command> 或 RUN [“<executable>”,”<param1>”,”<param2>”]
第一种格式中,<command>通常是一个shell命令
第二种语法格式中的参数是一个JSON格式的数组,其中<executable>为要运行的命令,后面<paramN>为传递给命令的选项或参数
CMD
类似于RUN指令,可用于用于运行任何命令或应用程序
RUN指令运行在镜像文件构建过程中,CMD指令运行于启动容器时
在Dockerfile中可以存在多个CMD指令,但仅最后一个生效
格式:
CMD <command> 或 CMD [“<executable>”,”<param1>”,”<param2>”] 或
CMD [”<param1>”,”<param2>”]
第三种则用于ENTRYPOINT指令提供默认参数
ENTRYPOINT
类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且,这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序
格式:
ENTRYPOINT <command> 或 ENTRYPOINT [“<executable>”,”<param1>”,”<param2>”]
Docker run 命令传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后做为其参数使用
Dockerfle文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效
USER
用于指定运行image时,主进程的用户名和UID
默认情况下,container的运行身份为root用户
格式:
USER <UID> | <UserName>
需要注意的是,<UID>可以为任意数字,但必须为/etc/passwd中的某用户
HEALTHCHECK
检查进程健康状态
格式:
HEALTHCHECK [OPTIONS] CMD command 检查容器健康状态
HEALTHCHECK NONE 关闭容器健康检查
[OPTIONS]:
--interval=N (default:30s) 每N检查一次
--timeout=N (default:30s) 超时时长
--start-period=N (default:0s) 启动等待时长
--retries=N (default:3) 检查N次
SHELL
指定默认shell程序
格式:
SHELL [“executable”,”parameters”]
ARG
类似ENV,但只在build中生效
格式:
ARG KEY=”VAL” 或 ARG [“KEY1=VAL”,”KEY2=VAL2”]
命令中直接使用:
dockerfile build --build-arg key=”val”
ARG与ENV区别:
ARG:在Dockerfile中使用,仅仅在build docker image的过程中(包括CMD和ENTRYPOINT)有效,在image被创建和container启动之后,无效。
ENV:在Dockerfile中使用,在build docker imag的过程中有效,在image被创建和container启动后作为环境变量依旧也有效,并且可以重写覆盖。printenv可查看其值。
arg 是在 build 的时候存在的, 可以在 Dockerfile 中当做变量来使用
env 是容器构建好之后的环境变量, 不能在 Dockerfile 中当参数使用
ONBUILD
用于在dockerfile中定义一个触发器
当dockerfile第一次做成镜像时不会触发ONBUILD,但做成镜像后被其他dockerfile引用,会被触发执行
格式:
ONBUILD <dockerfile命令>
ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令