如今,很难忽略Docker。 网络上有很多博客文章。 问题是大多数情况下总是重复相同的步骤。 在本文中,我想重点介绍一个用例忽略的指令:它是Java特定的,但是可以很容易地将并行引入其他技术堆栈。
问题
情况如下:作为一名开发人员,我想使用Docker作为从应用程序源打包JAR的一种方式。
提醒一下,这是一个示例Maven结构:
|__ src | |__ main | |__ java | |__ Application.java | |__ resources | |__ application.properties |__ pom.xml
使用Docker,就像创建一个从Maven映像继承的Dockerfile一样简单:
FROM maven:3.6.0-alpine (1)
WORKDIR app (2)
COPY . /app (3)
RUN mvn package (4)
- 从Dockerhub上的官方Maven映像之一开始
- 将工作目录设置为
app
- 将当前主机目录复制到图像
app
文件夹 - 构建JAR
这按预期工作。
现在,让我们想象一下,我需要打包几个这样的应用程序。 所有Dockerfile都将遵循上述相同的结构。 这与DRY原理相矛盾。
解决方案
Dockerfiles语法中可用的许多指令中有一个是ONBUILD
。
当将映像用作另一构建的基础时,
ONBUILD
指令会将触发指令添加到映像中。 该触发器将在下游构建的上下文中执行,就像它已被插入到下游Dockerfile
的FROM
指令之后Dockerfile
。
https://docs.docker.com/engine/reference/builder/#onbuild
其要点是,它颠倒了标准方法: 代替 Dockerfile显式添加文件和运行命令, ONBUILD
提供了一个画布,以便只需要填补空白即可。
让我们创建一个这样的“父” 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
并使用构建映像来构建应用程序:
FROM mavenbase:latest (1)
- 是的,只需要一个指令!
docker build-f app.Dockerfile -t myapp .
结论
除了简单的用法外,Docker还提供了广泛的功能。 其中, ONBUILD
指令可通过考虑父映像中的重复配置来大幅减少Dockerfile的大小。
翻译自: https://blog.frankel.ch/onbuild-overlooked-docker-directive/