需求
最近做的一个应用使用 Elasticsearch 做全文搜索引擎,由于是中文的全文搜索,需要 Elasticsearch 的中文分词插件对内容进行分词,经过调研决定使用 Elasticsearch 5.1.1 版本(现已更新成 5.2.0 版本)和 elasticsearch-analysis-ik 中文分词插件。
使用 Docker 搭建环境
我主要使用 Docker 来搭建一切开发环境,所以便想到了使用 Elastisearch 的官方 Docker 镜像扩展安装 ik 分词插件的方案。
方案一:使用 docker commit 的方式扩展
先说结果,这种方式扩展官方镜像无法启动,具体原因不明,读者如果知道,请告诉我。
之所以一开始使用这种方案是因为我自己 Django 开发环境的镜像都是这样扩展的,但是经过我的测试用这种方式扩展 PostgreSQL 和 Elasticsearch 的官方 Docker 镜像就会导致扩展后的镜像无法启动,虽然不能使用,我还是把这个方案的操作流程分享出来。
操作流程
下载 Elasticsearch 镜像
docker pull elasticsearch
下载 ik 的分词 进入 ik 的 release 下载页面,根据 Elasticsearch 的版本下载相应的编译好的 ik 分词插件,然后解压
进入镜像的 bash shell,新建 ik 分词插件文件夹
docker run -it elasticsearch:latest /bin/bash mkdir -p /usr/share/elasticsearch/plugins/ik
使用 docker copy 命令将下载并且解压好的 ik 分词拷贝到 docker container 里
docker copy elasticsearch-analysis-ik-5.2.0 es_container_id:/root
使用打开的 bash shell container 将 /root 目录下的 ik 分词文件拷贝到 /usr/share/elasticsearch/plugins/ik 中
cd /root cp -r elasticsearch-analysis-ik-5.2.0/* /usr/share/elasticsearch/plugins/ik
退出 docker container 并且将修改提交
docker commit -a 'add ik plugin' -m 'runforever' es_container_id{768cadafcd9} es_ik:latest
使用如下 docker-compose.yml 启动,启动命令 docker-compose up
version: '2' services: es: build: . image: es_ik:latest environment: - http.host=0.0.0.0 - transport.host=127.0.0.1
报错提示:
参考:ik 安装文档
方案二:使用 Dockerfile 扩展
上面的方案不行就只有使用 Dockerfile 扩展方案了,这个方案只是把上面的操作写到 Dockerfile 里。
FROM elasticsearch:latest RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list RUN apt-get update && apt-get install zip RUN mkdir -p /usr/share/elasticsearch/plugins/ik RUN cd /usr/share/elasticsearch/plugins/ik && wget https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v5.1.1/elasticsearch-analysis-ik-5.1.1.zip && unzip elasticsearch-analysis-ik-5.1.1.zip
使用:
docker build . -t es_ik:latest docker-compose up
运行结果:
GitHub 地址:es_ik5.1.1
总结
如果需要给官方 Docker 官方镜像添加功能,使用 Dockerfile 的方式就可以了。
小技巧一:使用 daocloud 可以加速下载 Docker Hub 镜像的速度,使用教程。
小技巧二:扩展镜像的时候把软件源换成国内的源,例如:
RUN sed -i 's/deb.debian.org/mirrors.ustc.edu.cn/g' /etc/apt/sources.list