驽马十驾 驽马十驾

驽马十驾,功在不舍

目录
Dockerfile脚本中的定义变量ARG的坑
/  

Dockerfile脚本中的定义变量ARG的坑

开篇

公司的Elasticsearch使用了 ik插件和 pinyin插件,同时增加了一些个性化配置,所以为了方便的快速部署,必须在官方的镜像包中继续添加一些东西。
编写脚本的时候,希望将ES的版本定义为变量,方便后续升级,结果遇到坑了。

正文

原本的脚本如下所示

# 定义ES版本号
ARG ES_VERSION
FROM elasticsearch:$ES_VERSION

# 下载ik和pinyin 分词器
RUN curl -LJ https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v$ES_VERSION/elasticsearch-analysis-ik-$ES_VERSION.zip -o ik.zip && 
unzip -n -d /usr/share/elasticsearch/plugins/ik/ ik.zip   && rm -fr ik.zip && 
curl -LJ https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v$ES_VERSION/elasticsearch-analysis-pinyin-$ES_VERSION.zip -o pinyin.zip && 
unzip -n -d /usr/share/elasticsearch/plugins/pinyin/ pinyin.zip   && rm -fr pinyin.zip

其中 ES_VERSION是通过编译脚本传入的,但是执行到FROM后面,就是下载ik的时候,总是会提示下载的是:download/v$ES_VERSION/elasticsearch-analysis-ik-$ES_VERSION.zip,就是 $ES_VERSION没有被解析。

经过查阅资料后发现,ARG的生命周期在FROM后会被截断,必须重新声明,修改如下

# 定义ES版本号
ARG ES_VERSION
FROM elasticsearch:$ES_VERSION
# FROM后再次定义
ARG ES_VERSION
# 下载ik和pinyin 分词器
RUN curl -LJ https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v$ES_VERSION/elasticsearch-analysis-ik-$ES_VERSION.zip -o ik.zip &&
unzip -n -d /usr/share/elasticsearch/plugins/ik/ ik.zip   && rm -fr ik.zip &&
curl -LJ https://github.com/medcl/elasticsearch-analysis-pinyin/releases/download/v$ES_VERSION/elasticsearch-analysis-pinyin-$ES_VERSION.zip -o pinyin.zip &&
unzip -n -d /usr/share/elasticsearch/plugins/pinyin/ pinyin.zip   && rm -fr pinyin.zip

结语

关键就是ARG如果在FROM前和FROM后都会使用到,那么之前和之后必须定义。

骐骥一跃,不能十步。驽马十驾,功在不舍。