公司的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后都会使用到,那么之前和之后必须定义。