Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。
使用Dockerfile定制镜像
1). 手动定制镜像并记录过程中所使用的命令;
2). 编写Dockerfile文件;
FROM 定制的镜像使用的母镜像
RUN 运行的命令集 (不同命令可以使用“&&”放在同一个RUN后面,以减少镜像的层数)
CMD 容器运行后执行的命令 (命令格式为“[“参数1”,“参数2”,“参数3”...]”)
3). 创建镜像
# docker image build -t <镜像名称>
4). 运行测试
指令详解
FROM
FROM image
FROM image:tag
FROM image@digest
FROM为后续指令设置基本镜像。每个有效的Dockerfile文件,必须在文件内首先指定基本镜像。
FROM在同一个Dockerfile文件中可能会出现多次,用于创建多个镜像。
如果在基本镜像“image”后没有“tag”项,则默认使用“latest”(最新)镜像。
MAINTAINER
为生成的镜像指定作者信息,如名字,邮箱等等。
RUN
# the command is run in a shell - /bin/sh -c
RUN <command>
# Executable form
RUN ["executable", "param1", "param2"]
RUN指令用于执行镜像新层上的命令并提交其结果。
注:指令每执行一次都会在docker上新建一层,可以以“&&”连接命令,以减少执行指令时创建的层数,避免镜像过大。
CMD
# Executable form
CMD ["executable", "param1", "param2"]`
# Provide default arguments to ENTRYPOINT
CMD ["param1", "param2"]`
# the command is run in a shell - /bin/sh -c
CMD command param1 param2
在每个Dockerfile内应该只有一个“CMD”,如果存在多个,则只有最后一个生效。
CMD的主要意图是为执行的容器提供默认值(默认开启进运行的命令)。
RUN和CMD的区别在于,RUN运行命令并且提交结果,但CMD在镜像创建时生成任何结果,只是指定容器运行后默认执行的命令。
LABEL
LABEL <key>=<value> [<key>=<value> ...] or
LABEL <key>[ <value>]
LABEL <key>[ <value>]
...
LABEL用于向镜像中添加元数据。一个LABEL是一组“键-值”。如需为LABEL指定空值,可使用空字符串。如果要在LABEL中使用键值为“空格”,需使用双引号,在命令行中使用反斜杠。
查看镜像的标签(label),使用“docker inspect”命令。
EXPOSE
EXPOSE <port> [<port>...]
EXPOSE用于声明端口。帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。在实际运行“docker run -P”时,会自动映射EXPOSE的端口。
ENV
ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...
ENV用于设置环境变量,如果定义了环境变量,在后续的指令中,就可以使用这个变量。
ADD
ADD <src> <dest>
# Required for paths with whitespace
ADD ["<src>",... "<dest>"]
ADD用于复制,从上下文目录中复制文件或者目录到容器里指定的路径。
在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。
COPY
COPY [--chown=<user>:<group>] <src> <dest>
# Required for paths with whitespace
COPY [--chown=<user>:<group>] ["<src>",... "<dest>"]
[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
<src>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。
<dst>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
ENTRYPOINT
# executable form
ENTRYPOINT ["executable", "param1", "param2"]`
# run command in a shell - /bin/sh -c
ENTRYPOINT command param1 param2
类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。
如果运行 docker run 时使用了 --entrypoint 选项,此选项的参数可当作要运行的程序覆盖ENTRYPOINT 指令指定的程序。
优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。
VOLUME
VOLUME ["/path"]
VOLUME ["<path1>","<path2>"...]
定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。
可避免重要的数据因容器重启而丢失,由于挂载的是外部系统分区,可避免容器不断变大。
在启动容器的时候,可以通过“-v”参数修改挂载点。
USER
USER [user | user:group | uid | uid:gid | user:gid | uid:group ]
设置用于运行后续命令的用户。在未配置用户前,所有指令均以“root”用户运行。在Dockerfile文件中,USER指令可出现多次,但只对其后的指令生效。
WORKDIR
WORKDIR /path/to/workdir
WORKDIR指令为RUN,CMD,ENTRYPOINT,COPY和ADD等命令指定了工作目录。在Dockerfile文件中可使用多次,相对路径是相对于前一个WORKDIR指令的路径定义的。
ARG
ARG <name>[=<default value>]
构建参数,与 ENV 作用一至。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。
ONBUILD
ONBUILD [INSTRUCTION]
用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这是执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。
HEALTHCHECK
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令
HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。
用于指定某个程序或者指令来监控 docker 容器服务的运行状态。
来源:oschina
链接:https://my.oschina.net/u/4340533/blog/4600495