在docker映像中设置elasticsearch-似乎已启动但curl未响应

vmpqdwk3  于 2023-01-25  发布在  ElasticSearch
关注(0)|答案(1)|浏览(198)

我正在尝试创建一个使用本地[单节点] elasticsearch示例的docker映像。(在docker容器中,我打算(1)启动elasticsearch示例;(2)通过python脚本创建索引并加载文档;(3)通过flask服务器使索引可用于查询。)我在启动es示例时遇到问题。它看起来正在启动,但当我尝试curl localhost:9200时,它的连接被拒绝。

FROM ubuntu:latest

SHELL ["/bin/bash", "-c"]
RUN apt-get -y update && apt-get install -y --no-install-recommends \
         sudo \
         wget \
         gnupg \
         curl \
         unzip \
         tar \
         ca-certificates \
         lsb-release \
         python3-pip \
         python3-setuptools \
         nginx \
    && rm -rf /var/lib/apt/lists/*

#setup elasticsearch
RUN wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.0-linux-aarch64.tar.gz
RUN tar -xzvf elasticsearch-8.6.0-linux-aarch64.tar.gz

##create a new user and give es permissions to it to start a node
RUN useradd es_user
RUN chown es_user:es_user -R elasticsearch-8.6.0
USER es_user
RUN echo "discovery.type: single-node" >> elasticsearch-8.6.0/config/elasticsearch.yml
RUN echo "xpack.security.enabled: false" >> elasticsearch-8.6.0/config/elasticsearch.yml
#RUN echo "network.host: 0.0.0.0" >> elasticsearch-8.6.0/config/elasticsearch.yml
#RUN echo "http.port: 9200" >> elasticsearch-8.6.0/config/elasticsearch.yml
#RUN echo "http.host: 0.0.0.0" >> elasticsearch-8.6.0/config/elasticsearch.yml
RUN  elasticsearch-8.6.0/bin/elasticsearch -d
RUN sleep 30
RUN echo $(curl -s -w '%{http_code}' localhost:9200)

所有步骤似乎都运行良好,但curl命令返回000而不是200:

#18 [15/15] RUN echo $(curl -s -w '%{http_code}' localhost:9200)
#18 sha256:94cb4cd9486b0bf9a80c77c7648ba19ab373c3f8ec8e1131b3d68a0a55e0b268
#18 0.182 000
#18 DONE 0.2s

另一方面,如果我通过docker桌面在这个容器中打开一个终端(如果我注解掉对elasticsearch的调用,以便实际上可以构建映像),我可以使用elasticsearch-8.6.0/bin/elasticsearch -d启动elasticsearch(与我在docerfile中使用的方法相同),然后如果我尝试相同的curl命令,我将得到200。

{ "name" : "5bced6805917", "cluster_name" : "elasticsearch", "cluster_uuid" : "IAcnbmcfTmC84MjI3Y-jiA", "version" : { "number" : "8.6.0", "build_flavor" : "default", "build_type" : "tar", "build_hash" : "f67ef2df40237445caa70e2fef79471cc608d70d", "build_date" : "2023-01-04T09:35:21.782467981Z", "build_snapshot" : false, "lucene_version" : "9.4.2", "minimum_wire_compatibility_version" : "7.17.0", "minimum_index_compatibility_version" : "7.0.0" }, "tagline" : "You Know, for Search" }
200

PS.我在M1 Mac上使用docker build --progress=plain -t custom_es --no-cache .构建映像

bgibtngc

bgibtngc1#

您访问的页面不存在。

12 1.008 elasticsearch-8.6.0/bin/elasticsearch-cli: line 14: /elasticsearch-8.6.0/jdk/bin/java: cannot execute binary file: Exec format error

我在任何地方都没有看到java-sdk安装,这是elasticsearch所必需的。它必须安装在容器内并可执行。
另一方面,为什么要直接在图像中执行elasticsearch呢?
想象一个像计算机一样的容器,想象一个像硬盘一样的镜像,硬盘上已经安装了操作系统和你需要的一切。如果你在计算机上安装硬盘,打开电源,它会启动并执行你准备好的一切。
一个容器需要一个映像。那么当他从映像开始的时候,容器会做什么呢?他会在dockerfile中执行CMD,或者在容器构建的时候用你指定的命令覆盖它。
为了调试你的映像,你可以做以下的事情。让所有限制ElasticSearch的东西都注解掉。
试试看:

FROM ubuntu:latest

SHELL ["/bin/bash", "-c"]
RUN apt-get -y update && apt-get install -y --no-install-recommends \
         sudo \
         wget \
         gnupg \
         curl \
         unzip \
         tar \
         ca-certificates \
         lsb-release \
         python3-pip \
         python3-setuptools \
         nginx \
    && rm -rf /var/lib/apt/lists/*

#setup elasticsearch
RUN wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-8.6.0-linux-aarch64.tar.gz
RUN tar -xzvf elasticsearch-8.6.0-linux-aarch64.tar.gz

##create a new user and give es permissions to it to start a node
RUN useradd es_user
RUN chown es_user:es_user -R elasticsearch-8.6.0
USER es_user

CMD ["sleep","999999"]

然后运行它并执行它,或使用Dockerdesktop或通过命令行Docker exec.........
然后在容器内安装一步一步的ElasticSearch。
未生成错误的每个步骤将其添加到Dockerfile。
最后,在Docker文件中使用以下命令更改CMD
CMD [“弹性接头”、“选项1”、“选项2”]
CMD方面命令及其参数的数组。
最后一件事:
将配置写入映像本身并不是一个好的做法。
在你的主机上准备一个文件,比如elastic. yaml,当你用docker run(-v)或者docker compose(volumes)启动容器时,把这个文件Map到容器中。

相关问题