繁体   English   中英

Docker-Compose无法解析容器名称?

[英]Docker-Compose can't resolve names of containers?

我有一个比较棘手的问题,因为到今天为止似乎一直运转良好。 但是,我不知道从那以后发生了什么变化。 我运行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 Container中运行,但是它停止工作,报告Could not resolve host: elasticsearch; Unknown error 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图像。

码头工人,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:

对Elasticsearch进行卷曲是一个错误的捷径,因为它可能没有启动,加上Dockerfile可能完全是错误的地方

另外,如果我真的想使用Dockerfile,我也不会将此脚本放在Dockerfile中,但可能会使用它来更改映像的ENTRYPOINT(再次建议不要这样做)

最好的做法是在docker-file中有一个logstash服务,仅在更新的输入插件上包含映像,并删除Dockerfile中的所有其余行。 而且您可能有一个logstash_setup服务来执行设置位(使用logstash映像或什至更清洁应安装bash和curl的基本centos映像-因为您要做的就是运行几个curl命令传递一些文件)

我正在谈论的脚本可能看起来像这样:

#!/bin/bash
set -euo pipefail
es_url=http://elasticsearch:9200
# Wait for Elasticsearch to start up before doing anything.
until curl -s $es_url -k -o /dev/null; do
    sleep 1
done
#then put your code here
curl -XPUT -H 'Content-Type: application/json' http://elasticsearch:9200/_ ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM