Top Menu

dockerfile中如何进行if判断

由于部分github的release并非由docker编译,导致在构建image的时候无法直接通过docker内置的架构变量构造出下载地址。

例如,针对naiveproxy-$version-$os-$arch.tar.xz结构的格式,docker本身是有对应的TARGETOS和TARGETARCH全局变量,但是,docker的变量值是amd64,naiveproxy的变量值是x64。所以需要在dockerfile中判断架构并替换为naiveproxy架构。

需求

  • 根据不同的build系统架构进入不同的build处理流程,例如if到amd64,替换为x64后去github下载对应的release

实现-shell方案

通过增加layer的方法注入shell,让base image执行if命令,优点是只要shell支持的命令都可以运行,缺点是依赖base image,linux命令不兼容windows的base image。

example

实现-dockerfile方案

还有另外一种直接用dockerfile内置的判断方法,这种方案不依赖base image,而且不会增加layer。缺点是只能判断存在和不存在,不能对值的内容进行判断。(Via)

  • ${variable:-word},variable存在,返回variable,variable不存在,返回word
  • ${variable:+word},variable存在,返回word,variable不存在,返回variable

实现-export方案

这个方案其实是shell方案的衍生,但是docker build的时候,每一层的layer不会继承上层export的env,所以说,这个方案其实有点问题,如何利用这个if到的env,还没想到好办法。

唯一不跨layer的方法是直接在一个RUN里运行所有的代码,但是好像试了下也并不能识别这个export的env。

 

One comment

  • Hello, guest

Powered by WordPress. Designed by WooThemes