余子越的博客
Toggle navigation
余子越的博客
主页
计算机网络
大数据分析
系统与工具
编程之路
容器引擎
作者
归档
标签
Dockerfile 命令总结
Docker
2018-09-02 13:35:34
88
0
0
yuziyue
Docker
[TOC] >Dockerfile 文件命令总结 # FROM - 功能 指定基础镜像,并且必须是第一条指令。如果不以任何镜像为基础,那么写法为:`FROM scratch`。 同时意味着接下来所写的指令将作为镜像的第一层开始 - 语法 ``` FROM <image> FROM <image>:<tag> FROM <image>:<digest> ``` - 说明 三种写法,其中`<tag>`和`<digest>` 是可选项,如果没有选择,那么默认值为latest <br><br> # MAINTAINER - 功能 指定作者 - 语法 `MAINTAINER <name>` - 说明 记录作者 <br><br> # WORKDIR - 功能 设置构建镜像时镜像的工作目录,相当于linux命令`cd`,对RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在则会创建,也可以设置多次。 - 语法 `WORKDIR /path/to/workdir` - 说明 相当于进入指定的目录,看下面例子。 ``` WORKDIR /a WORKDIR b WORKDIR c RUN pwd pwd 执行的结果是 /a/b/c ``` <br><br> # RUN - 功能 运行指定的命令,用于构建镜像。 - 语法 ``` RUN <command> param1 param2 RUN ["executable", "param1", "param2"] ``` - 说明 第一种后边直接跟shell命令,注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层,多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错。RUN书写时的换行符是`\` <br><br> # LABEL - 功能 为镜像指定标签 - 语法 ``` LABEL <key>=<value> <key>=<value> <key>=<value> ``` - 说明 LABEL会继承基础镜像种的LABEL,如遇到key相同,则值覆盖。 ``` LABEL label1="value1" \ label2="value2" \ other="value3" ``` <br><br> # EXPOSE - 功能 为暴漏容器运行时的监听端口给外部 - 语法 `EXPOSE port` - 说明 但是EXPOSE并不会使容器访问主机的端口,如果想使得容器与主机的端口有映射关系,必须在容器启动的时候加上 -p参数 <br><br> # ENV - 功能 设置环境变量 - 语法 ``` ENV <key> <value> ENV <key>=<value> <key>=<value> <key>=<value> ``` - 说明 环境变量,尽量一个命令写完所有环境变量 <br><br> # COPY - 功能 复制命令,从宿主机复制到镜像中。 - 语法 ``` COPY <src>... <dest> COPY ["<src>",... "<dest>"] # ik 目录拷贝到plugins目录下 ADD --chown=elasticsearch:elasticsearch plugins/ik /usr/share/elasticsearch/plugins/ik ``` - 说明 尽量使用 COPY, 避免使用 ADD。 <br><br> # ADD - 功能 复制命令,更高级的文件复制,把文件复制到镜像中,不推荐使用。 - 语法 ``` ADD <src>... <dest> ADD ["<src>",... "<dest>"] # ik 目录拷贝到plugins目录下 ADD --chown=elasticsearch:elasticsearch plugins/ik /usr/share/elasticsearch/plugins/ik ``` - 说明 `<dest>`路径的填写可以是容器内的绝对路径,也可以是相对于工作目录的相对路径 `<src>`可以是一个本地文件或者是一个本地压缩文件,如果是压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,ADD 指令将会自动解压缩这个压缩文件到目标路径去。 <br><br> # VOLUME - 功能 可实现挂载功能,可以将宿主机目录或者其他容器中的目录挂在到这个容器中。 - 语法 VOLUME ["/data"] - 说明 ["/data"]可以是一个JsonArray ,也可以是多个值。所以如下几种写法都是正确的,一般的使用场景为需要持久化存储数据时使用。 ``` VOLUME ["/var/log/"] VOLUME /var/log VOLUME /var/log /var/db ``` <br><br> # USER - 功能 设置启动容器的用户,可以是用户名或UID,所以,只有下面的两种写法是正确的 - 语法 ``` USER daemon USER UID ``` - 说明 注意:如果设置了容器以daemon用户去运行,那么RUN, CMD 和 ENTRYPOINT 都会以这个用户去运行 <br><br> # ARG - 功能 设置变量命令 - 语法 `ARG <name>[=<default value>]` - 说明 ARG命令定义了一个变量,在docker build创建镜像的时候,使用 `--build-arg <varname>=<value>`来指定参数,如果用户在build镜像时指定了一个参数没有定义在Dockerfile中,那么将有一个Warning。可以定义一个或多个参数, 并且可以有默认值,如下: ``` FROM busybox ARG user1="yuchaoshui" ARG buildno ``` <br><br> # ONBUILD - 功能 为当前镜像的子镜像添加命令,这个命令只对当前镜像的子镜像生效。 - 语法 ``` ONBUILD [INSTRUCTION] ``` - 说明 比如当前镜像为A,在Dockerfile种添加: ``` ONBUILD RUN ls -al ``` 这个 `ls -al` 命令不会在A镜像构建或启动的时候执行,此时有一个镜像B是基于A镜像构建的,那么这个`ls -al` 命令会在B镜像构建的时候被执行。 <br><br> # STOPSIGNAL - 功能 定义容器退出时给系统发送的命令。 - 语法 ``` STOPSIGNAL signal ``` - 说明 STOPSIGNAL 命令是的作用是当容器退出时给系统发送什么样的指令。 # HEALTHCHECK - 功能 容器健康状况检查命令 - 语法 ``` HEALTHCHECK [OPTIONS] CMD command HEALTHCHECK NONE ``` - 说明 第一个的功能是在容器内部运行一个命令来检查容器的健康状况。第二个的功能是在基础镜像中取消健康检查命令 [OPTIONS]的选项支持以下三中选项 ``` --interval=<间隔> 两次检查默认的时间间隔为30秒 --timeout=<时长> 健康检查命令运行超时时长,默认30秒 --retries=<次数> 当连续失败指定次数后,则容器被认为是不健康的,状态为unhealthy,默认次数是3 ``` 注意,HEALTHCHECK命令只能出现一次,如果出现了多次,只有最后一个生效。 CMD后边的命令的返回值决定了本次健康检查是否成功,具体的返回值如下: ``` 0: success - 表示容器是健康的 1: unhealthy - 表示容器已经不能工作了 2: reserved - 保留值 ``` - 例子 ``` HEALTHCHECK --interval=5m --timeout=3s \ CMD curl -f http://localhost/ || exit 1 ``` ``` 健康检查命令是:curl -f http://localhost/ || exit 1 两次检查的间隔时间是5秒 命令超时时间为3秒 ``` <br><br> # CMD - 功能 容器启动时要运行的命令,在构建镜像时并不会运行。此命令在运行容器时可以被替换掉。 - 语法 ``` CMD command param1 param2 CMD ["executable","param1","param2"] ``` - 说明 以列表参数形式给出时必须是双引号。CMD 运行的程序必须是前台应用。类似 `CMD service nginx start` 的命令应该修改成 `CMD ["nginx", "-g", "daemon off;"]`,因为`CMD service nginx start` 会被理解为 `CMD [ "sh", "-c", "service nginx start"]`,因此主进程实际上是 sh。那么当 service nginx start 命令结束后,sh 也就结束了,sh 作为主进程退出了然后容器就退出了。 <br><br> # ENTRYPOINT - 功能 启动时的入口点,常用于与CMD配合使用。在构建镜像时并不会运行。此命令在运行容器时也可以被替换掉,但是需要添加参数,比如`docker run --entrypoint`。 - 语法 ``` ENTRYPOINT ["executable", "param1", "param2"] ENTRYPOINT command param1 param2 ``` - 说明 当指定了 ENTRYPOINT 后,CMD 的含义就发生了改变,不再是直接的运行其命令,而是将 CMD 的内容作为参数传给 ENTRYPOINT 指令,换句话说实际执行时,将变为: ``` <ENTRYPOINT> "<CMD>" ``` - 使用场景1 点击访问: [让镜像变成像命令一样使用](https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/entrypoint.html#%E5%9C%BA%E6%99%AF%E4%B8%80%EF%BC%9A%E8%AE%A9%E9%95%9C%E5%83%8F%E5%8F%98%E6%88%90%E5%83%8F%E5%91%BD%E4%BB%A4%E4%B8%80%E6%A0%B7%E4%BD%BF%E7%94%A8) - 使用场景2 点击访问: [应用运行前的准备工作](https://yeasy.gitbooks.io/docker_practice/content/image/dockerfile/entrypoint.html#%E5%9C%BA%E6%99%AF%E4%BA%8C%EF%BC%9A%E5%BA%94%E7%94%A8%E8%BF%90%E8%A1%8C%E5%89%8D%E7%9A%84%E5%87%86%E5%A4%87%E5%B7%A5%E4%BD%9C) <br><br>
上一篇:
CentOS 7 修改镜像下载地址
下一篇:
Docker 运行容器
0
赞
88 人读过
新浪微博
微信
腾讯微博
QQ空间
人人网
文档导航