Docker学习之“Dockerfile”

人盡茶涼 提交于 2020-10-02 23:49:40

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 容器服务的运行状态。


引用“https://www.runoob.com/docker/docker-dockerfile.html

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!