如何使用 docker compose 安装 ElasticSearch 插件

Posted

技术标签:

【中文标题】如何使用 docker compose 安装 ElasticSearch 插件【英文标题】:How to install ElasticSeach plugins using docker compose 【发布时间】:2017-02-03 03:17:13 【问题描述】:

我有一个带有弹性搜索图像的 docker-compose.yml 文件:

elasticsearch:
  image: elasticsearch
  ports:
    - "9200:9200"
  container_name: custom_elasticsearch_1

如果我想安装其他插件,例如 HQ 界面或附件映射器,我必须使用以下命令进行手动安装:

$ docker exec custom_elasticsearch_1 plugin install royrusso/elasticsearch-HQ
$ docker exec custom_elasticsearch_1 plugin install mapper-attachments

有没有办法在我运行docker-compose up 命令时自动安装它们?

【问题讨论】:

【参考方案1】:

Here 是 Elastic 的一篇博文,与此完全相关!您需要使用 Dockerfile 来执行命令来扩展图像。您的 Dockerfile 将如下所示:

FROM custom_elasticsearch_1

RUN elasticsearch-plugin install royrusso/elasticsearch-HQ

【讨论】:

嗯,所以如果不添加另一个 Dockerfile 就没有办法实现这一点吗?我想在 docker-compose 里面做 如果将构建命令添加到 docker-compose.yml,Docker compose 会使用 Dockerfile。 Here 是在 Compose 中使用 Dockerfile 的示例。但是,here 是有人在没有 Dockerfile 的情况下安装插件的示例。 我明白了,显然总是需要一个附加文件。 谢谢,@fylie。您的回答今天可能为我节省了几个小时。 这不适用于截至 2021 年的最新 Docker 版本。RUN plugin install <plugin_name> 抛出错误说 plugin in not found!以下作品:RUN elasticsearch-plugin install analysis-icu 请更新答案,因为这已被问题所有者接受为答案。【参考方案2】:

受@NickPridorozhko 的回答启发,但使用 elasticsearch^7.0.0(使用 docker stack / swarm)进行了更新和测试,使用 analysis-icu 的示例:

elasticsearch:
  image: docker.elastic.co/elasticsearch/elasticsearch:7.3.0
  user: elasticsearch
  command: >
    /bin/sh -c "./bin/elasticsearch-plugin list | grep -q analysis-icu 
    || ./bin/elasticsearch-plugin install analysis-icu; 
    /usr/local/bin/docker-entrypoint.sh"
  ...

主要区别在于 ^7.0.0 的更新命令,以及使用 docker 入口点而不是 ./bin/elasticsearch(在堆栈的上下文中,您会收到与可生成进程限制相关的错误) .

【讨论】:

当我使用它来安装 repoistory-s3 时,这给了我一个错误“警告:插件需要额外的权限” @Kay 这似乎不相关。请参阅this github issue 和此other answer。【参考方案3】:

这对我有用。之前安装插件,然后继续启动elasticsearch。

elasticsearch:
  image: elasticsearch
  command:
    - sh
    - -c
    - "plugin list | grep -q plugin_name || plugin install plugin_name;
       /docker-entrypoint.sh elasticsearch"

【讨论】:

【参考方案4】:

ingest-attachment 插件需要额外的权限,并在安装过程中提示用户。我使用了yes 命令:

elasticsearch:
  image: elasticsearch:6.8.12
  command: >
    /bin/sh -c "./bin/elasticsearch-plugin list | grep -q ingest-attachment 
    || yes | ./bin/elasticsearch-plugin install --silent ingest-attachment; 
    /usr/local/bin/docker-entrypoint.sh eswrapper"

【讨论】:

在docker compose上试过可以确认这个工作【参考方案5】:

如果您使用来自sebp/elkELK 堆栈

你需要设置你的Dockerfile

FROM sebp/elk

ENV ES_HOME /opt/elasticsearch
WORKDIR $ES_HOME

RUN yes | CONF_DIR=/etc/elasticsearch gosu elasticsearch bin/elasticsearch-plugin \
    install -b mapper-attachments

如在https://elk-docker.readthedocs.io/#installing-elasticsearch-plugins 上看到的那样。

它也应该只适用于 Elastic Search。

【讨论】:

【参考方案6】:

Elasticsearch v6.8.15 的示例。 为简单起见,我们将使用docker-compose.ymlDockerfile

Dockerfile的内容:

FROM docker.elastic.co/elasticsearch/elasticsearch:6.8.15

RUN elasticsearch-plugin install analysis-icu
RUN elasticsearch-plugin install analysis-phonetic

还有内容docker-compose.yml

version: '2.2'
services:
  elasticsearch:
    #image: docker.elastic.co/elasticsearch/elasticsearch:6.8.15
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: elasticsearch
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - http.cors.allow-headers=X-Requested-With,Content-Type,Content-Length,Authorization
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata1:/usr/share/elasticsearch/data
      - esplugins1:/usr/share/elasticsearch/plugins
    ports:
      - 9268:9200
    networks:
      - esnet
  elasticsearch2:
    #image: docker.elastic.co/elasticsearch/elasticsearch:6.8.15\
    build:
      context: ./
      dockerfile: Dockerfile
    container_name: elasticsearch2
    environment:
      - cluster.name=docker-cluster
      - bootstrap.memory_lock=true
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - http.cors.allow-headers=X-Requested-With,Content-Type,Content-Length,Authorization
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
      - "discovery.zen.ping.unicast.hosts=elasticsearch"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - esdata2:/usr/share/elasticsearch/data
      - esplugins2:/usr/share/elasticsearch/plugins
    networks:
      - esnet

volumes:
  esdata1:
    driver: local
  esdata2:
    driver: local
  esplugins1:
    driver: local
  esplugins2:
    driver: local

networks:
  esnet:

这是来自 Elasticsearch 网站本身 https://www.elastic.co/guide/en/elasticsearch/reference/6.8/docker.html#docker-cli-run-prod-mode 的默认 Elasticsearch 6.8.15 docker-compose.yml 文件。我为其中两个节点添加了两个named data volumesesplugins1esplugins2。所以这些插件可以在docker-compose down之间持久化。

注意,如果您曾经运行过docker-compose down -v,那么这些卷将被删除!

我注释掉了image 行并将该图像移至Dockerfile。然后使用RUN 命令添加elasticsearch-plugin 安装命令。这个 elasticsearch-plugin 命令在 elasticsearch 容器中本机可用。一旦进入容器外壳,您就可以检查这一点。

【讨论】:

以上是关于如何使用 docker compose 安装 ElasticSearch 插件的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 docker compose 安装 ElasticSearch 插件

(Docker)如何在 WordPress 容器中使用单独的 Composer 容器安装依赖项?

docker-compose安装

如何将 docker-compose 升级到最新版本

如何在Ubuntu 20.04上安装Docker Compose

如何在Ubuntu 20.04上安装Docker Compose