ONBUILD,被忽略的Docker指令

如今,很难忽略Docker。 网络上有很多博客文章。 问题是大多数情况下总是重复相同的步骤。 在本文中,我想重点介绍一个用例忽略的指令:它是Java特定的,但是可以很容易地将并行引入其他技术堆栈。

问题

情况如下:作为一名开发人员,我想使用Docker作为从应用程序源打包JAR的一种方式。

提醒一下,这是一个示例Maven结构:

|__ src
|     |__ main
|           |__ java
|                 |__ Application.java
|           |__ resources
|                 |__ application.properties
|__ pom.xml

使用Docker,就像创建一个从Maven映像继承的Dockerfile一样简单:

Docker文件
FROM maven:3.6.0-alpine    (1)

WORKDIR app                (2)
COPY . /app                (3)
RUN  mvn package            (4)
  1. 从Dockerhub上的官方Maven映像之一开始
  2. 将工作目录设置为app
  3. 将当前主机目录复制到图像app文件夹
  4. 构建JAR

这按预期工作。

现在,让我们想象一下,我需要打包几个这样的应用程序。 所有Dockerfile都将遵循上述相同的结构。 这与DRY原理相矛盾。

解决方案

Dockerfiles语法中可用的许多指令中有一个是ONBUILD

当将映像用作另一构建的基础时, ONBUILD指令会将触发指令添加到映像中。 该触发器将在下游构建的上下文中执行,就像它已被插入到下游DockerfileFROM指令之后Dockerfile

— Docker文档
https://docs.docker.com/engine/reference/builder/#onbuild

其要点是,它颠倒了标准方法: 代替 Dockerfile显式添加文件和运行命令, ONBUILD提供了一个画布,以便只需要填补空白即可。

让我们创建一个这样的“父” Dockerfile。

maven.Dockerfile
FROM maven:3.6.0-alpine

WORKDIR app
ONBUILD COPY . /app
ONBUILD RUN  mvn package

从此文件,可以创建图像:

docker build-f maven.Dockerfile -t mavenbase .
这不需要任何项目,但Dockerfile本身。

在以后的任何时间点,都可以从任何与Maven兼容的文件夹结构中创建精简的Dockerfile并使用构建映像来构建应用程序:

项目.Dockerfile
FROM mavenbase:latest   (1)
  1. 是的,只需要一个指令!
docker build-f app.Dockerfile -t myapp .

结论

除了简单的用法外,Docker还提供了广泛的功能。 其中, ONBUILD指令可通过考虑父映像中的重复配置来大幅减少Dockerfile的大小。

翻译自: https://blog.frankel.ch/onbuild-overlooked-docker-directive/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值