我遇到了一个棘手的问题,因为到今天为止似乎一直运转良好。但是,我不知道从那以后发生了什么变化。我运行docker-compose up --build --force-recreate
,但构建失败,因为它无法解析主机名。
该问题具体是由于其中一个Dockerfile中的CURL命令造成的:
USER logstash
WORKDIR /usr/share/logstash
RUN ./bin/logstash-plugin install logstash-input-beats
WORKDIR /tmp
COPY templates/winlogbeat.template.json winlogbeat.template.json
COPY templates/metricbeat.template.json metricbeat.template.json
RUN curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/metricbeat-6.3.2 -d@metricbeat.template.json
RUN curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_template/winlogbeat-6.3.2 -d@winlogbeat.template.json
最初,我在Elasticsearch容器中运行了这些命令,但是该命令停止工作,报告Could not resolve host: elasticsearch; Unknown error
我认为可能是试图过早执行RUN命令,因此将进程移至Logstash容器,但问题仍然存在。 Logstash取决于Elasticsearch,因此应在Logstash容器尝试运行Elastic时启动并运行Elastic。
我尝试删除图像,容器,网络等,但是似乎没有什么可以让我在构建过程中运行这些CURL命令。
我在想Docker守护进程可能正在缓存DNS名称,但由于已经删除并重新创建了几次网络,因此无法弄清楚如何重置它。
有人可以提出任何想法吗?
主机:Ubuntu Server 18.04
SW:Docker-CE(当前版本)
ELK堆栈:全部是Elastic提供的官方6.3.2图像。
Docker-Compose.YML:
version: '2'
services:
elasticsearch:
build:
context: elasticsearch/
volumes:
- esdata:/usr/share/elasticsearch/data
- ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml:ro
# ports:
# - "9200:9200"
# - "9300:9300"
environment:
ES_JAVA_OPTS: "-Xmx512m -Xms512m"
HOSTNAME: "elasticsearch"
networks:
- elk
logstash:
build:
context: logstash/
volumes:
- ./logstash/config/logstash.yml:/usr/share/logstash/config/logstash.yml:ro
- ./logstash/pipeline:/usr/share/logstash/pipeline:ro
ports:
- "5000:5000"
- "5044:5044"
- "5045:5045"
environment:
LS_JAVA_OPTS: "-Xmx256m -Xms256m"
networks:
- elk
depends_on:
- elasticsearch
kibana:
build:
context: kibana/
volumes:
- ./kibana/config/:/usr/share/kibana/config:ro
# Port 5601 is not exposed outside of the container
# Can be accessed through Nginx Reverse Proxy only
# ports:
# - "5601:5601"
networks:
- elk
depends_on:
- elasticsearch
nginx:
build:
context: nginx/
environment:
- APPLICATION_URL=http://docker.local
volumes:
- ./nginx/conf.d/:/etc/nginx/conf.d:ro
ports:
- "80:80"
networks:
- elk
depends_on:
- elasticsearch
fouroneone:
build:
context: fouroneone/
# No direct access, only through Nginx Reverse Proxy
# ports:
# - "8181:80"
networks:
- elk
depends_on:
- elasticsearch
networks:
elk:
driver: bridge
volumes:
esdata:
答案 0 :(得分:0)
运行curl到elasticsearch是一个错误的快捷方式,因为它可能无法启动,加上Dockerfile可能完全是错误的地方
如果我真的想使用Dockerfile(同样我不建议这样做),我也不会将此脚本放入Dockerfile中,但可能会使用它来更改映像的ENTRYPOINT。
此处最好的做法是在docker-file中有一个logstash服务,仅在更新的输入插件上提供映像,并删除Dockerfile中的所有其余行。并且您可能拥有一个logstash_setup服务来执行设置位(使用logstash映像或什至更清洁应安装bash和curl的基本centos映像-因为您要做的就是运行几个curl命令传递一些文件)
我正在谈论的脚本可能看起来像这样:
Set