在Dockerfile中,有一种方法可以检测Docker引擎是运行Linux还是Windows容器,然后在文件中切换指令类型,例如执行dir命令而不是查找?
是否有更好的方法来创建包装Dockerfile的批处理/ shell并以这种方式执行切换?创建1个文件以统治所有规则的更多操作,而不必确定引擎的配置方式。
答案 0 :(得分:0)
通常,当我完成这种事情时,我发现编写最能完成一件事情的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 repository中,每种口味都有一个单独的Dockerfile,但它们都是由a hairy bash script生成的。