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

时间:2018-07-30 22:49:25

标签: docker elasticsearch docker-compose logstash

我遇到了一个棘手的问题,因为到今天为止似乎一直运转良好。但是,我不知道从那以后发生了什么变化。我运行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:

1 个答案:

答案 0 :(得分:0)

运行curl到elasticsearch是一个错误的快捷方式,因为它可能无法启动,加上Dockerfile可能完全是错误的地方

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

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

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

Set