在docker映像中设置elasticsearch -似乎启动了,但curl没有响应



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

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(与我在dockerfile中使用的方式相同)。然后,如果我尝试同样的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

p。我在M1 mac上使用docker build --progress=plain -t custom_es --no-cache .构建图像

您上传的图片无法使用

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("elasticserachcomand">

CMD,"option1","option2"]

CMD方面:命令及其参数的数组。

最后一件事:

将配置写入映像本身并不是一个好做法。

在主机上准备一个文件。比如elastic。yaml。当您使用docker run (-v)或docker compose (volumes)启动容器时,将该文件映射到容器中。

最新更新