一, Dockerfile 概述
Dockerfile 是 docker 程序的解释脚本文件, Dockerfile 是一条一条的指令, Docker 程序将 dockerfile 中的一条条指令编译成 Linux 可执行的命令. Dockerfile 有自己书写格式和支持的命令, Docker 程序解决这些命令间的依赖关系, 类似于 Makefile.Docker 程序将读取 Dockerfile, 根据指令生成定制的 image. 相比 image 这种黑盒子, Dockerfile 这种显而易见的脚本更容易被使用者接受, 它明确的表明 image 是怎么产生的. 有了 Dockerfile, 当我们需要定制自己额外的需求时, 只需在 Dockerfile 上添加或者修改指令, 重新生成 image 即可, 省去了敲命令的麻烦.
在 Dockerfile 中用到的命令有这些:
指令 | 说明 |
FROM | 指定所创建镜像的基础镜像 |
MAINTAINER | 指定维护者信息 |
RUN | 运行命令 |
CMD | 指定启动容器时默认执行的命令 |
LABEL | 指定生成镜像的元数据标签信息 |
EXPOSE | 声明镜像内服务所监听的端口 |
ENV | 指定环境变量 |
ADD | 赋值指定的 & lt;src> 路径下的内容到容器中的 & lt;dest> 路径下,<src> 可以为 URL;如果为 tar 文件,会自动解压到 & lt;dest> 路径下 |
COPY | 赋值本地主机的 & lt;scr> 路径下的内容到容器中的 & lt;dest> 路径下;一般情况下推荐使用 COPY 而不是 ADD |
ENTRYPOINT | 指定镜像的默认入口 |
VOLUME | 创建数据挂载点 |
USER | 指定运行容器时的用户名或 UID |
WORKDIR | 配置工作目录 |
ARG | 指定镜像内使用的参数 (例如版本号信息等) |
ONBUILD | 配置当前所创建的镜像作为其他镜像的基础镜像时,所执行的创建操作的命令 |
STOPSIGNAL | 容器退出的信号 |
HEALTHCHECK | 如何进行健康检查 |
SHELL | 指定使用 SHELL 时的默认 SHELL 类型 < br ztid="97" ow="0" oh="0"> |
二, 指令详解
2.1 From 指令
- FROM <image>
- FROM <image>:<tag>
- FROM <image>@<digest>
FROM 指定构建镜像的基础源镜像, 如果本地没有指定的镜像, 则会自动从 Docker 的公共库 pull 镜像下来.
FROM 必须是 Dockerfile 中非注释行的第一个指令, 即一个 Dockerfile 从 FROM 语句开始.
FROM 可以在一个 Dockerfile 中出现多次, 如果有需求在一个 Dockerfile 中创建多个镜像.
如果 FROM 语句没有指定镜像标签, 则默认使用 latest 标签.
2.2 MAINTAINER 指令
MAINTAINER <name>
指定创建镜像的用户
2.3 Run 指令
在创建镜像的时候需要执行的命令.
- # 由 shell 启动, Linux 默认为 `/bin/sh -c`,Windows 默认为 `cmd /S /C`
- RUN <command>
- # 运行可执行文件
- RUN ["executable", "param1", "param2"]
每条 RUN 指令将在当前镜像基础上执行指定命令, 并提交为新的镜像, 后续的 RUN 都在之前 RUN 提交后的镜像为基础, 镜像是分层的, 可以通过一个镜像的任何一个历史提交点来创建, 类似源码的 版本控制 http://lib.csdn.net/base/git .
exec 方式会被解析为一个 JSON 数组, 所以必须使用双引号而不是单引号. exec 方式不会调用一个命令 shell, 所以也就不会继承相应的变量.
2.4 CMD 指令
镜像创建后, 运行容器需要执行的命令.
- CMD ["executable","param1","param2"] (执行可执行文件, 优先)
- CMD ["param1","param2"] (设置了 ENTRYPOINT, 则直接调用 ENTRYPOINT 添加参数)
- CMD command param1 param2 (执行 shell 内部命令)
CMD 指定在 Dockerfile 中只能使用一次, 如果有多个, 则只有最后一个会生效.
CMD 的目的是为了在启动容器时提供一个默认的命令执行选项. 如果用户启动容器时指定了运行的命令, 则会覆盖掉 CMD 指定的命令.
2.5 LABEL 指令
给镜像添加信息. 使用 docker inspect 可查看镜像的相关信息.
- LABEL "com.example.vendor"="ACME Incorporated"
- 2.6 EXPOSE
指定于外界交互的端口, 在容器启动时用 - p 传递参数, 例如 - p 3307:3306 将容器内的 3306 绑定到本机的 3307
EXPOSE <port> [<port>...]
告诉 Docker 服务端容器对外映射的本地端口, 需要在 docker run 的时候使用 - p 或者 - P 选项生效.
2.7 ENV
设置环境变量
- ENV <key> <value> # 只能设置一个变量
- ENV <key>=<value> ... # 允许一次设置多个变量
指定一个环节变量, 会被后续 RUN 指令使用, 并在容器运行时保留.
2.8 ADD
将本地文件添加到容器中, identity, gzip, bzip2,xz,tar.gz,tgz 等类型的文件将被添加 tar -x 命令, 进行解压
ADD <src>... <dest>
ADD 复制本地主机文件, 目录或者远程文件 URLS 从 并且添加到容器指定路径中 .
支持通过 Go http://lib.csdn.net/base/go 的正则模糊匹配, 具体规则可参见 Go filepath.Match http://golang.org/pkg/path/filepath/#Match
- ADD hom*/mydir/ # 添加所有以 "hom" 开头的文件
- ADD hom?.txt /mydir/ # ? 替代一个单字符, 例如:"home.txt"
- ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
- ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
路径必须是绝对路径, 如果 不存在, 会自动创建对应目录
路径必须是 Dockerfile 所在路径的相对路径
如果是一个目录, 只会复制目录下的内容, 而目录本身则不会被复制
- 2.9 COPY
- COPY <src>... <dest>
COPY 复制新文件或者目录从 并且添加到容器指定路径中 . 用法同 ADD, 唯一的不同是不能指定远程文件 URLS.
- 2.10 ENTRYPOINT
- ENTRYPOINT "executable", "param1", "param2"
- ENTRYPOINT command param1 param2 (shell form)
配置容器启动后执行的命令, 并且不可被 docker run 提供的参数覆盖, 而 CMD 是可以被覆盖的. 如果需要覆盖, 则可以使用 docker run --entrypoint 选项.
每个 Dockerfile 中只能有一个 ENTRYPOINT, 当指定多个时, 只有最后一个生效.
- 2.11 VOLUME
- VOLUME ["/data"]
- VOLUME ["/data"]
- VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
用于指定持久化目录, 在容器启动时用 - v 传递参数, 例如
-v ~/opt/data/mysql:/var/lib/mysql
将本机的~/opt/data/mysql 和容器内的 / var/lib/mysql 做持久化关联
容器启动时会加载, 容器关闭后会回写.
- 2.12 USER
- USER daemon
指定运行容器时的用户名或 UID, 后续的 RUN,CMD,ENTRYPOINT 也会使用指定用户.
- 2.13 WORKDIR
- WORKDIR /path/to/workdir
为后续的 RUN,CMD,ENTRYPOINT 指令配置工作目录. 可以使用多个 WORKDIR 指令, 后续命令如果参数是相对路径, 则会基于之前命令指定的路径.
- WORKDIR /a (这时工作目录为 / a)
- WORKDIR b (这时工作目录为 / a/b)
- WORKDIR c (这时工作目录为 / a/b/c)
- 2.14 ARG
- ARG <name>[=<default value>]
由外部启动时必须传入的参数, 在容器启动时用 --build-arg 传递参数
指定于外界交互的端口, 在容器启动时用 - p 传递参数, 例如
- --build-arg CONT_IMG_VER=v2.0.1
- 2.15 ONBUILD
- ONBUILD [INSTRUCTION]
配置当所创建的镜像作为其它新创建镜像的基础镜像时, 所执行的操作指令.
如果基于 image-A 创建新的镜像时, 新的 Dockerfile 中使用 FROM image-A 指定基础镜像时, 会自动执行 ONBUILD 指令内容, 等价于在后面添加了两条指令.
2.16 HEALTHCHECK
容器健康状况检查命令.
- HEALTHCHECK [OPTIONS] CMD command
- HEALTHCHECK NONE
第一个的功能是在容器内部运行一个命令来检查容器的健康状况
第二个的功能是在基础镜像中取消健康检查命令
[OPTIONS] 的选项支持以下三中选项:
--interval=DURATION 两次检查默认的时间间隔为 30 秒
--timeout=DURATION 健康检查命令运行超时时长, 默认 30 秒
--retries=N 当连续失败指定次数后, 则容器被认为是不健康的, 状态为 unhealthy, 默认次数是 3
注意:
HEALTHCHECK 命令只能出现一次, 如果出现了多次, 只有最后一个生效.
来源: https://www.cnblogs.com/wuwei928/p/9055432.html