FROM:指定基础镜像

在Dockerfile中FROM是必备的指令,用于指定基础的镜像。

FROM centos:latest

LABEL:指定镜像标签

LABEL指令用来指定镜像的标签。

格式:

 LABEL <key>=<value> <key>=<value>...

例子:

LABEL author="jiajiezhao"

RUN: 执行命令

RUN指令是用于来执行命令行命令的。

格式:

shell格式: RUN <命令>

RUN echo '<h1>hello,world!<h1>' >/usr/share/nginx/html/index.html

exec格式: RUN ["可执行文件","参数1","参数2"]

COPY:复制指令

COPY指令将从构建上下文目录中<源路径>的文件/目录复制到新的一层镜像内<目标路径>位置。

源路径可以是多个,也可以是通配符。目标路径可以是绝对路径,当然也可以是相对于WORKDIR指定的目录的相对路径。目标路径不需要事先创建,如何目录不存在会在复制文件前自动创建。

格式:

COPY <源路径> ... <目标路径>
COPY ["<源路径",..."<目标路径>"]

注意:使用COPY 指令,源文件的各种元数据都会保留,如读写执行权限等。

COPY home*  /mydir/
COPY index.html /mydir/

ADD:高级复制文件

ADD和COPY的格式一样,但是在COPY上增加了一些高级功能,如源路径可以是一个URL,下载后的文件权限自动设置为600,源路径也可以是一个压缩包,docker会自动帮你解压。但是其行为并不清晰,还不如使用COPY命令。

注意:此功能并不实用,不推荐实用。ADD指令会使得镜像构建的缓存失效,从而使镜像构建变得比较缓慢。

CMD:容器启动命令

CMD指令格式和RUN指令相似

shell格式:CMD <cmd>
exec格式:CMD ["可执行文件","参数1","参数2",...]
参数列表格式:CMD ["参数1","参数2"...],在指定了`ENTRYPOINT`指令后,用CMD指定具体的参数。

docker不是虚拟机,容器就是进程,既然是进程,在启动容器的时候,就需要指定所运行的程序及其参数,CMD指令就是用于指定默认的容器主进程的启动命令的 。

在运行时可以指定新的命令来替代镜像中设置的这个默认命令。如:

docker run -it ubuntu cat /etc/os-release

此时就是使用cat命令替换了默认的/bin/bash命令,输出了系统版本信息。

一般推荐使用exec格式命令,这类格式在解析时会被解析成JSON数组,一定要使用双引号,而不要使用单引号。

如何使用shell格式的话,实际命令会被包装成sh -c参数的形式进行执行。如

CMD echo $HOME

实际为:

CMD [ "sh","-c","echo $HOME"]

使用环境变量会被shell进行解析出来。

ENTRYPOINT:入口点

ENTRYPOINT格式和RUN指令格式一样,分为exec格式和shell格式,该指令的目的和CMD一样,都是指定容器启动程序及其参数。ENTRYPOINT在运行时也可以被替代,但是需要通过docker run参数 --entrypoint来指定。

当指定了ENTRYPOINT后,CMD的含义就发生了改变,不再是直接运行的命令,而是将CMD的内容作为参数传给ENTRYPOINT指令。如变为:

<ENTRYPOINT> "<CMD>"

这样就可以直接在docker run 后面指定参数传给ENTERYPOINT。

ENV:设置环境变量

格式:

ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2> ...

该指令用来设置环境变量,为其后面运行的指令直接指定环境变量。如:

ENV NODE_VERSION 7.2.0
RUN curl -SLO "https://nodejs.org/dist/$NODE_VERSION-linux-x64.tar.gz"

支持环境变量的指令:

ADD COPY ENV EXPOSE LABEL USER WORKDIR VOLUME STOPSIGNAL ONBUILD

ARG:构建参数

格式: ARG <参数名>[=<默认值>]

构建 参数和ENV的效果一样,都是设置环境变量。不同的是,ARG所设置的环境变量,在将来容器运行时是不会存在这些环境变量的。

Dockerfile中的ARG指令用来定义参数名称,以及定义默认值,该默认值可以在构建命令docker build中的--build-arg <参数名>=<值>来覆盖。

VOLUME:定义匿名卷

格式:

VOLUME ["<路径1>","<路径2>"...]
VOLUME <路径>

容器在运行时应该尽量保持容器存储层不发生写操作,对于数据库等应用的数据文件应保持于卷中。在Dockerfile中,可以事先指定某些目录挂载为匿名卷,这样在运行时如果用户不指定挂载,其运用也可以正常运行,不会向容器存储层中写入大量数据。如:

VOLUME /data

这里的/data目录就会在容器运行时自动挂载为匿名卷,任何向/data中写入的信息都不会记录进容器存储层里,从而保证容器的存储层无状态化。

当然在运行时,也可以覆盖这个挂载设置如:

docker run -d -v mydata:/data xxx

此命令使用mydata这个命名卷挂载到了/data这个位置,替换了Dockerfile中定义的匿名卷的挂载配置。

EXPOSE:声明端口

格式:

EXPOSE <端口1>  [<端口2>...]

EXPOSE指令是声明容器运行时提供的端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。

声明端口的好处:

  1. 帮助镜像使用者理解这个镜像服务的守护端口,以方便映射
  2. 在运行时使用随机端口映射,即docker run -P时,会自动映射EXPOSE的端口

WORKDIR:指定工作目录

格式为:

WORKDIR <工作目录路径>

使用此指令来指定工作目录,以后在各层的当前目录就会被改为指定的目录。该目录必须是已经存在的目录,WORKDIR并不会帮你建立该目录。

USER:指定当前用户

格式:

USER <用户名>

USER指令和WORKDIR相似,都是改变环境状态并影响以后的层。WORKDIR是改变工作目录,USER则是改变以后各层执行命令的身份。

该用户必须是事先建立好的,否则无法切换。如:

RUN  groupadd -r www && useradd -r -g www www
USER www
RUN ["XXX"]

HEALTHCHECK:健康检查

格式:

HEALTHCHECK [选项] CMD <命令> :设置检查容器健康状况的命令
HEALTHCHECK NONE:如何基础镜像有健康检查指令,使用这行可以屏蔽掉这个健康检查指令。

该指令是告诉Docker应该如何进行判断容器的状态是否正常。

当一个镜像指定了HEALTHCHECK指令后,其启动容器,初始状态变为starting,在HEALTHCHECK指令检查成功后变为healthy,如何连续一定的次数失败,就会变成unhealthy。

HEALTHCHECK选项:

  • --interval=<间隔>:两次健康检查的间隔,默认是30秒
  • --timeouot=<时长>:健康检查命令运行的超时时间,如何超过这个时间就会认为失败。默认30s
  • --retries=<次数>:当连续失败指定的次数后,容器状态视为unhealthy。默认3次

HEALTHCHECK exit code:

0 成功

1 失败

2 保留

例子:

HEALTHCHECK --interval=5s --timeout=3m \
CMD curl -fs http://localhost/ || exit 1

这里使用3分钟检查一次,如何健康检查命令超过3秒没有反应就会视为失败。

ONBUILD: 触发器

格式:

  • ONBUILD <其他指令>

ONBUILD是一个特殊的指令,其后面接的是其他指令,如RUN,COPY等。这些指令在构建当前镜像是不会执行,只有以当前镜像为基础镜像,去构建下一级镜像的时候才会被执行。

容器中的应用在前台和后台执行的问题:

Docker不是虚拟机,容器中的应用都应该以前台执行,而不是像虚拟机和物理机一样,可以使用systemd去启动后台服务,容器内没有后台服务的概念。对于容器而言,其启动的程序就是容器应用进程,容器是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其他辅助进程不是它需要关心的。正确做法是直接执行可执行文件,并且要求以前台形式存在。如

CMD ["nginx","-g","daemon off"]

Dockerfile指令介绍的更多相关文章

  1. Docker学习(三): Dockerfile指令介绍

    特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...

  2. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

  3. docker(8)Dockerfile指令介绍

    前言 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. Dockerfile简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列 ...

  4. docker学习笔记17:Dockerfile 指令 ONBUILD介绍

    ONBUILD指令可以为镜像添加触发器.其参数是任意一个Dockerfile 指令. 当我们在一个Dockerfile文件中加上ONBUILD指令,该指令对利用该Dockerfile构建镜像(比如为A ...

  5. Docker(二):Dockerfile 使用介绍

    上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...

  6. Docker(二):Dockerfile使用介绍

    上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...

  7. Docker应用三:Dockerfile使用介绍(以安装redis为例)

    Dockerfile使用介绍 一.Dockerfile介绍 Dockerfile用于自定义创建docker镜像,是由一行行命令组成的文件. Docker file中的命令根据作用分为四类: 1.1.指 ...

  8. C#中的预编译指令介绍

    原文:C#中的预编译指令介绍 1.#define和#undef 用法: #define DEBUG #undef DEBUG #define告诉编译器,我定义了一个DEBUG的一个符号,他类似一个变量 ...

  9. corosync+pacemaker的crmsh的常用指令介绍

    配置crmsh的yum仓库,此仓库的RPM包有openSUSE提供,将这个network:ha-clustering:Stable.repo文件直接下载到本地并且命名为crmsh.repo wget ...

随机推荐

  1. 一种快速过VMP3.x调试器虚拟机检测的方法

    VMP3.x 以上的版本的壳代码引入了一个标志位数值 Flags, 根据这个Flags值的位执行对应的事情. 比如: and 2 = 2 表示检测用户层调试器 and 4 = 4 表示检测内核调试器 ...

  2. JMeter关联的几种方式总结案例

    1.接口响应结果,通常为HTML.JSON格式的数据,对于HTML的响应结果的提取,可以通过正则表达式,也可以通过XPath 来提取. 2.对于JSON格式的数据,可以通过正则表达式.JSON Ext ...

  3. Game 23

    Polycarp plays "Game 23". Initially he has a number nn and his goal is to transform it to  ...

  4. jQuery AJAX相关方法

    接jQuery学习上篇.因为AJAX是相对独立的一块,所以和jQuery的随笔分开记录了.素材同样来自runoob. 先了解下什么是AJAX. AJAX = 异步 JavaScript 和 XML(A ...

  5. 支付宝红包口令自动复制到剪贴板脚本js,安卓,IOS通用版

    有客户找到涛舅舅,要求开发一个可以自动支付宝红包口令的js脚本,经过大量探索和优化,目前此脚本功能已经测试成功! 预期效果: 只要来访用户在当前网页的任意位置点击一下,支付宝红包口令即可复制到用户手机 ...

  6. 【安全性测试】利用反编译查看对应activity的方法采用hook技术绑定劫持_入门

    本次主要为了研究手机端的安全性而写的一篇文章,在基于自己对手机安全性的研究下,想到了这些工具之间的结合,当然这也算是第一次对手机安全研究勇敢地踏出一步,也不知道是否成功,还是准备撞南墙撞到底吧! 使用 ...

  7. mac搭建简单的hls推流服务器遇到的问题(待更新)

    实际操作步骤: 输入brew install nginx-full --with-rtmp-module命令出现以下报错: 需要先安装nginx服务器,运行命令brew tap homebrew/ng ...

  8. 创建python虚拟环境如果速度很慢

    conda create -n jjenv python=3.6如果我们这样子创建的话下载速度很慢,那就可以用如下方式,相当于改了下载源. conda create -n jjenv python=3 ...

  9. css中文字体解决方案

    html { font-family: -apple-system, "Noto Sans", "Helvetica Neue", Helvetica, &qu ...

  10. ueditorUE 去掉本地保存成功的提示框!

    网上修改什么JS的太麻烦,这样比较暴力,仅供参考 这里直接修改的样式: ue.ready(function () {                 $(".edui-editor-mess ...