Dockerfile 第5关:ONBUILD和VOLUME指令

本文详细介绍了Dockerfile中的ONBUILD和VOLUME指令。ONBUILD用于定义镜像构建时的触发器,VOLUME则用于指定匿名数据卷。通过示例展示了如何使用这两个指令来增强Docker镜像的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Dockerfile    第5关:ONBUILD和VOLUME指令

任务描述

本关的任务是学习ONBUILD和VOLUME两个指令,要求学习者参照示例,熟悉ONBUILD和VOLUME两个指令,本关将不做评测,无论输入什么都会评测通过。

相关知识

本关将介绍ONBUILDVOLUME指令。

ONBUILD指令

●ONBUILD 添加一个将来执行的触发器(trigger)
格式:
ONBUILD <其它指令>

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

ONBUILD指令的具体执行步骤

(1) 在构建过程中,ONBUILD指令会添加到触发器指令镜像元数据中,这些触发器指令并不会在当前构建过程中执行。
(2) 在构建过程后,触发器指令会被存储在镜像详情中,其主键是
OnBuild,可以使用docker inspect命令查看。
(3) 在之后该镜像可能作为其他Dockerfile中FROM指令的参数。在构建过程中,
FROM指令会查找ONBUILD触发器指令,并且会以它们注册的顺序执行。若有触发器指令执行失败,则FROM指令被中止,并返回失败;若所有触发器指令执行成功,则FROM指令完成并继续执行下面的指令。在镜像构建完成后,触发器指令会被清除,不会被子孙镜像继承。

ONBUILD指令的实例

1.首先编写一个Dockerfile文件,内容如下所示:

  1. FROM busybox
  2. ONBUILD RUN touch 1.txt

2.利用上面的Dockerfile文件构建一个新镜像:docker build -t image1 .。执行docker run image1 cat 1.txt,提示:cat: can't open '1.txt': No such file or directory。可以知道基于image1镜像构建的容器中不存在1.txt文件。我们通过inspect image1,在里面可以找到。

  1. "OnBuild":[
  2. "RUN touch 1.txt"
  3. ],

3.编写一个新的Dockerfile文件,内容如下所示:

  1. FROM image1
  2. RUN echo 'hello'

4.利用第三步创建的的Dockerfile文件构建一个新镜像:docker build -t image2 .。如下所示:在执行完FROM指令后,首先执行的是触发器,也就是# Executing 1 build trigger...,该指令创建了一个1.txt文件。然后才执行RUN echo 'hello'。执行docker run image2 cat 1.txt,执行成功!!

  1. [root@localhost dir1]# docker build -t image2 .
  2. Sending build context to Docker daemon 2.048 kB
  3. Step 1/2 : FROM image1
  4. # Executing 1 build trigger...
  5. Step 1/1 : RUN touch 1.txt
  6. ---> Running in 5c9b99ef7801
  7. ---> 4c5b719176b8
  8. Removing intermediate container 5c9b99ef7801
  9. Step 2/2 : RUN echo 'hello'
  10. ---> Running in 8a2598e90e1f
  11. hello
  12. ---> f5642bb4a975
  13. Removing intermediate container 8a2598e90e1f
  14. Successfully built f5642bb4a975
  15.  
  16. [root@localhost dir1]# docker run image2 cat 1.txt`
  17. [root@localhost dir1]#

VOLUME指令

●VOLUME 定义匿名卷
格式:
VOLUME ["<路径1>", "<路径2>"...]VOLUME <路径>

之前我们说过,容器运行时应该尽量保持容器存储层不发生写操作,对于数据库类需要保存动态数据的应用,其数据库文件应该保存于数据卷(volume)中,后面的章节我们会进一步介绍 Docker数据卷的概念。

参考文献:《Docker容器与容器云p179》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值