首页 > 解决方案 > Dockerfile 中是否有等效的预处理器指令?

问题描述

在 Dockerfile 中,有没有办法检测 Docker 引擎是运行 Linux 还是 Windows 容器,然后切换文件中的指令类型,例如执行 dir 命令而不是 find?

创建一个包装 Dockerfile 并以这种方式执行切换的批处理/shell 是更好的方法吗?更多的是创建一个文件来统治它们,而无需确定引擎的配置方式。

标签: dockerdockerfile

解决方案


一般来说,当我完成这类事情时,我发现编写一个只做一件事的 Dockerfile 是最容易的,如果您需要完全不同的行为,则编写多个 Dockerfile 是最容易的。在您描述的情况下,我希望 Windows 和 Linux 容器设置如此不同(每个命令都会不同),我只需要编写一个单独的 Dockerfile。

如果图像将被非常轻微地参数化——你可能希望在不同的 JVM 上运行本质上相同的东西,但是无论哪个安装过程都是相同的——ARG 可以解决这个问题。您可以在单个 RUN 命令中使用 shell 逻辑来根据 ARG 值做出决策。

如果您确实需要更多,那么 Docker 没有内置预处理器,但 Dockerfile 只是文本文件,因此您选择的预处理器或模板语言(envsubst、m4、Jinja...)可以正常工作.

你可以在一些标准的 Docker 镜像中看到这一点。例如,openjdk映像有 Java 7、8、10 和 11;使用完整的 JDK、基本运行时或精简运行时;适用于 Windows、Debian 或 Alpine Linux。在openjdk GitHub 存储库中,每种风格都有一个单独的 Dockerfile,但它们都是由一个毛茸茸的 bash 脚本生成的。


推荐阅读