Docker学习(三): Dockerfile指令介绍
特别声明:
博文主要是学习过程中的知识整理,以便之后的查阅回顾。部分内容来源于网络(如有摘录未标注请指出)。内容如有差错,也欢迎指正!
=============系列文章=============
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分为四部分:基础镜像信 ...
随机推荐
- c语言博客作业06-文件
1.本章总结 1.1思维导图 1.2本章学习体会 这周学了结构体和文件,结构体作为一种数据的归类方式,相比数组或变量更具有整体全面性,例如一个数组只可以放一些按照元素顺序存放的单元变量,并且我们用 ...
- 1087 1 10 100 1000(打表 set 数学)
1087 1 10 100 1000 题目来源: Ural 1209 基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 收藏 关注 1,10,100,1000... ...
- 【OCP-12c】CUUG 071题库考试原题及答案解析(21)
3.choose three View the Exhibit and examine the description of SALES and PROMOTIONS tables. You want ...
- linux 下的 crontab 定时任务工具
以下内容转自:https://www.cnblogs.com/longjshz/p/5779215.html 在LINUX中,周期执行的任务一般由cron这个守护进程来处理[ps -ef|grep c ...
- LG的nexus5(32GB版本 - 821)-TOT-底包 可用于救砖!
LG的nexus5(32GB版本 - 821)-TOT-底包 底层修复效果完美,通过LGflashTool1.8直接刷进去就行~ 底包下载: https://pan.baidu.com/s/1Z5WD ...
- wpa2破解代码思路(教你写poc)
前言:此篇关于1.wpa2协议漏洞的产生原因:2.scapy这个数据包库的基础:3.最后讲解代码思路,让你们从伪代码可以直接写成代码展开介绍分享~ 本文作者:i春秋签约作家——kaikaix 1.大家 ...
- Mutation Observer
MutationEvent Mutation Observer 变动观察器, 等待所有脚本任务完成后,才会运行(即异步触发方式) 把DOM变动记录封装成一个数组进行处理,而不是一条条个别处理DOM变动 ...
- vscode调试typescript
1.记录一个插件:https://www.npmjs.com/package/ts-node # Locally in your project npm install -D ts-node npm ...
- pixi.js v5版本出了。
历尽千辛万苦,pixi.js v5版本出了. 请关注群 881784250, 会尽块出个微信小游戏版. pixi.js的每个函数,每个类都有测试用例的.出的版本都是很稳定的.
- 正则表达式 IP域名
不废话,我这个起码不坑人,有的把我坑死 var objRegExp = /^((([1-9]|([1-9]\d)|(1\d\d)|(2([0-4]\d|5[0-5]))))\.)((([0-9]|([ ...