docker - Dockerfile 中是否有等效的预处理器指令?
问题描述
在 Dockerfile 中,有没有办法检测 Docker 引擎是运行 Linux 还是 Windows 容器,然后切换文件中的指令类型,例如执行 dir 命令而不是 find?
创建一个包装 Dockerfile 并以这种方式执行切换的批处理/shell 是更好的方法吗?更多的是创建一个文件来统治它们,而无需确定引擎的配置方式。
解决方案
一般来说,当我完成这类事情时,我发现编写一个只做一件事的 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 脚本生成的。
推荐阅读
- python - 构造函数中没有默认参数,默认参数都在二维列表中
- node.js - 根据请求的路由加载 React SPA
- sql - SQL Server CTE 递归次数过多
- algorithm - 这是解决背包问题的正确方法吗?
- robotframework - Robot Framework 中 SudsLibrary 中的导入问题
- microcontroller - 使用 UART 串行通信将 4 个微控制器连接到 pc
- asp.net-core-2.0 - Asp.Net Core 2.0 WCF 客户端 CustomBinding PlatformNotSupportedException:不支持 BuildChannelFactoryCore
- javascript - ReactJS:如何在选择输入上显示占位符
- json - 使用 JQ 将 JSON blob 转换为 BQ 友好格式
- javascript - 理解 JavaScript 代码 - 将值传递给已由具有值的函数定义的对象