特别声明:
博文主要是学习过程中的知识整理,以便之后的查阅回顾。部分内容来源于网络(如有摘录未标注请指出)。内容如有差错,也欢迎指正!
=============系列文章=============
3. Docker学习(三): Dockerfile指令介绍
=================================
COPY:从构建上文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>为止
格式1:COPY <源路径>...<目标路径>
格式2:COPY ["<源路径1>",..."<目标路径>"]
示例:COPY packge.json /usr/src/app
<源路径>:可以是多个,甚至可以是通配符(符合Go的filepath.Match规则)
<目标路径>:可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用WORKDIR指令来指定)。目标路径不需要事先创建,如果不存在会在复制文件前先行创建确实目录。
注:使用COPY指令,源文件的各种元数据都会保留。比如读写执行权限、文件变更时间等。这个特性对于镜像定制很有用,特别是构建相关文件都在使用Git进行管理的时候。
ADD:与COPY的格式和性质基本一致,但在COPY基础上增加了一些功能
<源路径>:可以是一个URL, Docker引擎会试图去下载这个连接的文件到<目标路径>去。下载后文件权限自动设置为600;另外,如果下载的是个压缩包,需要解压缩则需要额外的一层RUN指令进行解压缩。如果<源路径>为一个tar压缩文件的话,ADD指令将会自动解压缩这个压缩文件到<目标路径>去。
注:尽可能使用COPY,因为COPY的语义明确。最适合使用ADD的场合,就是所提及的需要自动解压缩的场合。另外ADD指令会令镜像构建缓存失效,从而导致镜像构建变得缓慢。
CMD:指定默认的容器主进程的启动命令,在运行时可以指定新的命令来替代镜像设置中这个的默认命令。
shell格式:CMD <命令>,这种格式实际的命令会被包装为sh -c的参数形式进行执行
示例:CMD echo $HOME ------实际执行变更为-----> CMD [ "sh", "-c", "echo $HOME" ]
exec格式(推荐,一定要使用双引号):CMD ["可执行文件", "参数1", "参数2"]
参数列表格式:CMD ["参数1", "参数2"], 在指定了ENTRYPOINT指令后,使用CMD指定具体的参数
注:Docker不是虚拟机,容器中的应用都应该以前台执行。对于容器而言,其启动程序就是容器应用进程,容器就是为了主进程而存在的,主进程退出,容器就失去了存在的意义,从而退出,其他辅助进程不是它需要关心的。比如 CMD service nginx start,容器执行后会立即退出,原因是该命令会被理解为 CMD ["sh", "-c", "service nginx start"],因此主进程是sh,sh一旦结束,容器也随之退出。正确的写法: CMD ["nginx", "-g", "daemon off;"],以前台形式运行。
ENTRYPOINT:格式与RUN指令格式一样,分为exec格式和shell格式。该指令的作用是指定容器启动程序及参数,与CMD有些类似。当指定了ENTRYPOINT后,CMD的含义就发生了改变,不在是直接的运行其命令,而是将CMD的内容作为参数传给ENTRYPOINT指令。
ENV:设置环境变量。无论是其后面的其他指令(如RUN),还是运行时的应用,都可以直接使用这里定义的环境变量
格式1:ENV <key><value>
格式2:ENV <key1>=<value1> <key2>=<value2> ...
注:含有空格的变量值需要双引号括起来, 在指令中以$key1的方式获取变量。环境变量可以在ADD、COPY、ENV、EXPOSE、LABEL、USER、WORKDIR、VOLUME、STOPSIGNAL、ONBUILD指令展开。
ARG:构建参数,与ENV一样设置环境变量;所不同的是,ARG所设置的构建环境的环境变量,在将来容器运行时是不会存在这些环境变量的。可以通过docker history来查看。
格式:ARG <参数名>[=<默认值>], 定义参数名称以及默认值。默认值可以在构建命令docker build中用--build-arg <参数名>=<值>覆盖。
VOLUME:指定目录挂载为匿名卷,这样数据不会向容器存储层写入。运行时可用-v参数覆盖挂载设置。
格式1:VOLUME ["路径1", "路径2", ...]
格式2:VOLUME <路径>
EXPOSE:声明运行时容器提供服务端口,只是声明,在运行时并不会因为声明就会开启这个端口的服务。
格式:EXPOSE <端口1> [<端口2>...]
声明的好处:一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处测试在运行时使用随机端口映射(docker run -P)时会自动随机映射EXPOSE的端口。
WORKDIR:指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如果目录不存在,WORDIR会帮你建立目录。
USER:指定当前用户,改变环境状态并影响以后的层。USER是改变之后层的执行RUN,CMD以及ENTRYPOINT这类命令的身份。切换的用户必须是事先建立好的,否则无法切换。
注:如果以root执行的脚本,在执行期间希望改变身份。不要使用su或者sudo,建议使用gosu。
HEALTHCHECK:判断容器主进程的服务状态是否还正常。
HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,该指令可以屏蔽掉其他健康检查指令。
--interval=<间隔>:两次健康检查的间隔,默认为30秒
--timeout=<时长>:健康检查命令运行超时时间,超过时间视为失败,默认30秒
--retries=<次数>:连续失败指定次数后,则容器状态视为unhealthy,默认3次
注:和CMD,ENTRYPOINT一样,HEALTHCHECK只可以出现一次,若写了多个,只有最后一个生效。
ONBUILD:该指令后面跟的是其他指令,比如RUN,COPY等,这些指令在构建镜像的时候不会被执行,只有当前镜像为基础镜像,去构建下一集镜像的时候才会被执行。ONBUILD是为了帮助别人定制自己而准备的。
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
参考:
1.《docker_practice》
2. Dockerfile官方文档
Docker学习(三): Dockerfile指令介绍的更多相关文章
-
Docker应用三:Dockerfile使用介绍(以安装redis为例)
Dockerfile使用介绍 一.Dockerfile介绍 Dockerfile用于自定义创建docker镜像,是由一行行命令组成的文件. Docker file中的命令根据作用分为四类: 1.1.指 ...
-
Docker学习(11) Dockerfile指令
Dockerfile指令 指令格式 FROM MAINTAINER RUN EXPOSE CMD ENTRYPOINT ADD COPY VOLUME WORKDIR ENV USER ONBUILD ...
-
[转帖]Docker学习之Dockerfile命令详解
Docker学习之Dockerfile命令详解 https://it.baiked.com/system/docker/2436.html 图挺好的 前言 之前,制作镜像的伪姿势搭建已经见过了,今天介 ...
-
Docker学习笔记三 Dockerfile 指令 定制镜像
本文地址:https://www.cnblogs.com/veinyin/p/10412079.html 镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是 ...
-
docker之Dockerfile指令介绍
Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...
-
docker(8)Dockerfile指令介绍
前言 Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. Dockerfile简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列 ...
-
Docker(二):Dockerfile 使用介绍
上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...
-
Docker 学习8 Dockerfile详解2
一.继续上章节Docker学习7 CMD命令后. 11.ENTRYPOINT a.容器启动后相当于会启动ENTRYPOINT + CMD 命令,CMD相当于参数传给entrypoint的 [root@ ...
-
Docker系列三:Dockerfile
Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于基础镜像并最终创建一个新的镜像 Dockerfile由一行行命令语句组成,支持#开头的注释 Dockerfile分为四部分:基础镜像信 ...
随机推荐
-
PHP之:析构函数
如何正确理解PHP析构函数 参考文献:http://developer.51cto.com/art/200912/167023.htm 初次学习PHP语言的朋友们可能对PHP析构函数有些不太了解.我们 ...
-
SLAM学习笔记(2)SLAM算法
SLAM算法分为三类:Kalman滤波.概率滤波.图优化 Kalman滤波方法包括EKF.EIF:概率滤波包括RBPF,FastSLAM是RBPF滤波器最为成功的实例, 也是应用最为广泛的SLAM方法 ...
-
更改SAP GUI 登陆背景
您也可以定制初始屏幕(SAP Easy Access): 所有用户的全局设置:o 更改位于初始屏幕右侧的登录 - 如果希望将登录放置在初始屏幕右侧,请按如下处理: 使用事务 SW ...
-
设计原则 Design Principle
Design Principle设计原则 最近由于碰到要参与设计一个音频处理系统,有人提议用一个大的全局变量结构体来做状态信息交流的地方,引起了我对设计一个系统的思考,于是找到了如下资料,当然,关于这 ...
-
MySQL基础学习之触发器
查看触发器 SHOW TRIGGER\G 创建触发器 CREATE TRIGGER 触发器名字 BEFORE/AFTER DELETE ON 表名 FOR EACH ROW INSERT INTO 表 ...
-
unity3d 数学的数学基础和辅助类
转载注明smartdot:http://my.oschina.net/u/243648/blog/67193 1. 数学(点乘/叉乘)/unity3d的数学辅助类 2. 坐标系统(本地/世界/屏幕 ...
-
php数组和对象转换函数
/** * 数组 转 对象 * * @param array $arr 数组 * @return object */ function array_to_object($arr) { ...
-
最大公约数gcd与最小公倍数lcm
最大公约数:gcd 最大公倍数:lcm gcd和lcm的性质:(我觉得主要是第三点性质) 若gcd (
-
(7)MySQL的事务
什么是事物: 作用:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节.事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像 ...
-
【laravel54】详解中间件
1.中间件定义:对http请求进行一层过滤,通过过滤才能继续执行请求 2.中间件方法handle方法参数详解: 其中参数的形式可以有多个,使用[,]进行分割. 3.路由中使用中间件: 3.1 中间件使 ...