由于部分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。
1 2 3 4 |
RUN if [ "$env" = "defined" ]; \ then echo condition is true; \ else echo condition is false; \ fi |
example
1 2 3 4 5 6 7 8 |
。。。 ARG TARGETPLATFORM 。。。 RUN if [ "$TARGETPLATFORM" = "linux/amd64" ]; \ then wget -qO- "https://github.com/klzgrad/naiveproxy/releases/download/${VERSION}/${NAME}-${VERSION}-${TARGETOS}-x64.tar.xz" | \ tar -xvJf - ${NAME}-${VERSION}-${TARGETOS}-x64/naive --strip-components 1 && mv naive /usr/local/bin/naive; \ fi 。。。 |
实现-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。
1 2 3 4 5 |
ARG BUILDVAR=sad RUN if [ "$BUILDVAR" = "SO" ]; \ then export SOMEVAR=hello; \ else export SOMEVAR=world; \ fi |
One comment