1、ONBUILD指令说明

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

Dockerfile中的其它指令,都是为了定制当前镜像而准备的,唯有ONBUILD指令是为了帮助别人而定制自己,来准备的。

即:ONBUILD指令在构建一个有继承的Dockerfile文件时,父镜像在被子镜像继承后,父镜像的ONBUILD指令被触发(触发指令,类似一个触发器)。

2、演示ONBUILD指令的使用

(1)演示准备

我们创建一个Dockerfile文件:Dockerfile_onbuild

[root@192 mydockerfile]# pwd
/home/mydockerfile
[root@192 mydockerfile]# touch Dockerfile_onbuild

编辑Dockerfile_onbuild文件内容如下:

FROM centos  # 初始镜像
RUN yum install -y curl # 执行安装curl命令
ENTRYPOINT ["curl", "-s", "http://ip.cn"] # 容器启动后执行的命令 # 如果有谁继承了我,则触发下面命令
ONBUILD RUN echo "father---image---onbuild====886"

说明:假设有哪一个镜像继承了该镜像(父镜像),只要哪个子镜像build的时候,就会触发父镜像的ONBUILD指令。

(是不是有点蒙,继续往下看)

使用Dockerfile_onbuild文件生成onbuild/father镜像,如下:

[root@192 mydockerfile]# docker build -f /home/mydockerfile/Dockerfile_onbuild -t onbuild/father:1.0 .
Sending build context to Docker daemon 5.12kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : RUN yum install -y curl
---> Running in 11cd05afe92c
CentOS Linux 8 - AppStream 2.5 MB/s | 6.3 MB 00:02
CentOS Linux 8 - BaseOS 1.0 MB/s | 2.3 MB 00:02
CentOS Linux 8 - Extras 2.3 kB/s | 9.2 kB 00:03
Package curl-7.61.1-14.el8.x86_64 is already installed.
Dependencies resolved.
================================================================================
Package Architecture Version Repository Size
================================================================================
Upgrading:
curl x86_64 7.61.1-14.el8_3.1 baseos 353 k
libcurl-minimal x86_64 7.61.1-14.el8_3.1 baseos 285 k Transaction Summary
================================================================================
Upgrade 2 Packages Total download size: 638 k
Downloading Packages:
(1/2): curl-7.61.1-14.el8_3.1.x86_64.rpm 546 kB/s | 353 kB 00:00
(2/2): libcurl-minimal-7.61.1-14.el8_3.1.x86_64 406 kB/s | 285 kB 00:00
--------------------------------------------------------------------------------
Total 547 kB/s | 638 kB 00:01
CentOS Linux 8 - BaseOS 1.6 MB/s | 1.6 kB 00:00
warning: /var/cache/dnf/baseos-f6a80ba95cf937f2/packages/curl-7.61.1-14.el8_3.1.x86_64.rpm: Header V3 RSA/SHA256 Signature, key ID 8483c65d: NOKEY
Importing GPG key 0x8483C65D:
Userid : "CentOS (CentOS Official Signing Key) <security@centos.org>"
Fingerprint: 99DB 70FA E1D7 CE22 7FB6 4882 05B5 55B3 8483 C65D
From : /etc/pki/rpm-gpg/RPM-GPG-KEY-centosofficial
Key imported successfully
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transaction
Preparing : 1/1
Upgrading : libcurl-minimal-7.61.1-14.el8_3.1.x86_64 1/4
Upgrading : curl-7.61.1-14.el8_3.1.x86_64 2/4
Cleanup : curl-7.61.1-14.el8.x86_64 3/4
Cleanup : libcurl-minimal-7.61.1-14.el8.x86_64 4/4
Running scriptlet: libcurl-minimal-7.61.1-14.el8.x86_64 4/4
Verifying : curl-7.61.1-14.el8_3.1.x86_64 1/4
Verifying : curl-7.61.1-14.el8.x86_64 2/4
Verifying : libcurl-minimal-7.61.1-14.el8_3.1.x86_64 3/4
Verifying : libcurl-minimal-7.61.1-14.el8.x86_64 4/4 Upgraded:
curl-7.61.1-14.el8_3.1.x86_64 libcurl-minimal-7.61.1-14.el8_3.1.x86_64 Complete!
Removing intermediate container 11cd05afe92c
---> c88555f994f9
Step 3/4 : ENTRYPOINT ["curl", "-s", "http://ip.cn"]
---> Running in 9d9061a8d47e
Removing intermediate container 9d9061a8d47e
---> 96a5f70b56bf
Step 4/4 : ONBUILD RUN echo "father---image---onbuild====886"
---> Running in 68ca17cc9a0b
Removing intermediate container 68ca17cc9a0b
---> 05fdd64f3e60
Successfully built 05fdd64f3e60
Successfully tagged onbuild/father:1.0 # 查看本地Docker镜像
[root@192 mydockerfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
onbuild/father 1.0 05fdd64f3e60 42 seconds ago 243MB
centos latest 300e315adb2f 3 months ago 209MB

(2)开始演示

我们再创建一个Dockerfile文件:Dockerfile_onbuild_son

[root@192 mydockerfile]# pwd
/home/mydockerfile
[root@192 mydockerfile]# touch Dockerfile_onbuild_son

编辑Dockerfile_onbuild_son文件内容如下:

# 这里要继承上面生成的onbuild/father镜像
# 这样onbuild/father镜像就成了父镜像
# 通过该Dockerfile文件生成的镜像就是子镜像。
FROM onbuild/father:1.0 # 注意这里一定要加TAG版本,不然无法找到该镜像。
RUN yum install -y curl # 执行安装curl命令 CMD /bin/bash

使用Dockerfile_onbuild_son文件生成onbuild/son镜像。

如下:(请看下文中的注释)

[root@192 mydockerfile]# docker build -f /home/mydockerfile/Dockerfile_onbuild_son -t onbuild/son:1.0 .
Sending build context to Docker daemon 6.144kB
Step 1/3 : FROM onbuild/father:1.0
# Executing 1 build trigger # 看这三行,就是ONBUILD指令的效果
---> Running in 0a165ca6352c # Executing 1 build trigger 执行1个构建触发器
father---image---onbuild====886 # 数据是父镜像ONBUILD指令执行的内容
Removing intermediate container 0a165ca6352c
---> f9313959d1ae
Step 2/3 : RUN yum install -y curl
---> Running in 0485b0d9d031
Last metadata expiration check: 0:09:32 ago on Sat Mar 20 14:46:45 2021.
Package curl-7.61.1-14.el8_3.1.x86_64 is already installed.
Dependencies resolved.
Nothing to do.
Complete!
Removing intermediate container 0485b0d9d031
---> 0718c9a2d99a
Step 3/3 : CMD /bin/bash
---> Running in e102da5c1b5e
Removing intermediate container e102da5c1b5e
---> 46ed53584363
Successfully built 46ed53584363
Successfully tagged onbuild/son:1.0

以上就是ONBUILD指令的使用方式和效果。

3、补充:crul命令解释

  • curl命令可以用来执行下载、发送各种HTTP请求,指定HTTP头部等操作。
  • 如果系统没有curl命令可以使用yum install curl命令安装,也可以下载安装。
  • curl是将下载文件输出到stdout(标准输出,也就是控制台中)。

    例如:

    使用命令:curl http://www.baidu.com

    执行后,www.baidu.com的HTML页面内容,就会显示在屏幕上了。

    这是最简单的使用方法,用这个命令获得了URL所指向的页面。
  • 同样,如果这里的URL指向的是一个文件或者一幅图,都可以直接下载到本地。如果下载的是HTML文档,那么将缺省响应头部的信息,即HTML文档的header。要想全部显示,请加参数- i

『现学现忘』Docker基础 — 37、ONBUILD指令介绍的更多相关文章

  1. 『现学现忘』Docker基础 — 16、Docker中的基本概念和底层原理

    目录 1.Docker的底层原理 2.Docker中常用的基本概念 3.run命令的运行流程 4.为什么Docker比VM快 Docker架构图: 我们依照Docker架构图进行Docker基础概念的 ...

  2. 『现学现忘』Docker基础 — 9、Docker简介

    目录 1.什么是Docker? 2.Docker的出现解决了什么问题? 3.Docker的特别之处 4.Docker相关网站 1.什么是Docker? 2010年dotCloud公司在旧金山成立,PA ...

  3. 『现学现忘』Docker基础 — 25、Docker镜像讲解

    目录 1.镜像是什么 2.Docker镜像获取的方式 3.Docker镜像加载原理 (1)UnionFS(联合文件系统) (2)Docker镜像加载原理 1.镜像是什么 镜像是一种轻量级.可执行的独立 ...

  4. 『现学现忘』Docker基础 — 26、Docker镜像分层的理解

    目录 1.分层的镜像 2.加深理解 3.特别说明 1.分层的镜像 我们可以去下载一个镜像,注意观察下载的日志输出,可以看到Docker的镜像是一层一层的在下载. 思考:为什么Docker镜像要采用这种 ...

  5. 『现学现忘』Docker基础 — 27、Docker镜像的commit操作

    目录 1.commit命令作用 2.commit命令说明 3.示例演示 1.commit命令作用 在运行的容器中,并在镜像的基础上做了一些修改,我们希望保存起来,封装成一个新的镜像,方便我们以后使用, ...

  6. 『现学现忘』Docker基础 — 28、Docker容器数据卷介绍

    目录 1.什么是Docker容器数据卷 2.数据卷的作用 3.数据卷的使用 1.什么是Docker容器数据卷 Docker容器数据卷,即Docker Volume(卷). 当Docker容器运行的时候 ...

  7. 『现学现忘』Docker基础 — 32、通过DockerFile的方式挂载数据卷

    目录 1.简单了解一下DockerFile 2.通过DockerFile的方式挂载数据卷 (1)创建DockerFile文件 (2)编辑Dockerfile文件 (3)构建Dokcer镜像 (4)启动 ...

  8. 『现学现忘』Docker基础 — 34、DockerFile文件详解

    目录 1.DockerFile文件说明 2.Dockerfile构建过程解析 (1)Docker容器构建三步骤 (2)Dockerfile文件的基本结构 (3)Dockerfile注意事项 (4)Do ...

  9. 『现学现忘』Docker基础 — 35、实战:自定义CentOS镜像

    目录 1.前提说明 2.编写Dockerfile文件 3.构建镜像 4.运行镜像 5.列出镜像的变更历史 1)目标:自定义镜像wokong_centos. 2)所用到的保留字指令: FROM:基础镜像 ...

随机推荐

  1. UML 包图 详细介绍

      6.1 包图的概念 包是一种常规用途的组合机制.UML中的一个包直接对应于Java中的一个包,C#中的命名空间.在Java中,一个包可能含有其他包.类或者同时含有这两者.进行建模时,通常使用逻辑性 ...

  2. JZ-058-对称的二叉树

    对称的二叉树 题目描述 请实现一个函数,用来判断一棵二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 题目链接: 对称的二叉树 代码 /** * 标题:对称的二叉树 ...

  3. JZ-020-包含 min 函数的栈

    包含 min 函数的栈 题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈中所含最小元素的min函数(时间复杂度应为O(1)). 题目链接: 包含 min 函数的栈 代码 import jav ...

  4. SQL从零到迅速精通【数据库应用】

    数据库理论的研究主要集中于关系规范化理论和关系数据理论等.数据库技术与计算机技术的结合使得数据库中新的技术层出不穷.最初的数据库系统主要应用于银行管理.飞机订票等事务处理环境.后来渐渐应用于工程设计与 ...

  5. Lua中如何实现类似gdb的断点调试—07支持通过函数名称添加断点

    我们之前已经支持了通过函数来添加断点,并且已经支持了行号的检查和自动修正.但是通过函数来添加断点有一些限制,如果在当前的位置无法访问目标函数,那我们就无法对其添加断点. 于是,本篇我们将扩展断点设置的 ...

  6. ArcMap操作随记(11)

    1.直方图 在[Spatial Analyst]工具条中 2.分辨率变换 [重采样] :①最近邻法 ②双线性 ③三次卷积 重采样过程中要注意Nodata值 3.用ArcGIS进行监督分类 [影像分类] ...

  7. ENVI提取水系并进行生态敏感性分析

    4 具体步骤 4.1 DEM数据拼接 (1)打开ENVI软件,选择[File][Open],添加文件夹DEM数据中的影像,操作如图4.1.1所示,结果如图4.1.2. 图4.1.1 添加DEM数据影像 ...

  8. pyhon反射

    一:反射 1.python面向对象中的反射: 通过字符串的形式操作对象相关的属性.python中的一切事物都是对象(都可以使用反射) 2.四个内置方法 hasattr 检测是否含有某属性 getatt ...

  9. phpstudy、Apache安装DVWA教程

    1.下载DVWA(http://www.dvwa.co.uk/) 2.解压缩DVWA安装包到服务器的目录下 Apache: \Apache24\htdocs phpStudy: \PHPTutoria ...

  10. SINAMICS S120的核心控制单元CU320使用教程,电机模块接线

    SINAMICS是西门子公司新一代的驱动产品,它正在逐步取代现有的MASTERDRIVES及SIMODRIVE系列的驱动系统.SINAMICS S120是集V/f控制.矢量控制和伺服控制于一体的多轴驱 ...