【问题标题】:Docker pass configuration to yaml fileDocker 将配置传递给 yaml 文件
【发布时间】:2021-08-11 04:43:56
【问题描述】:

如何将容器名称传递给 elasticsearch.yml 中的 node.name,而不是将其复制到所有服务名称

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    container_name: es01
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - type: bind
        source: ./elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic

  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    container_name: es02
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - type: bind
        source: ./elasticsearch.yml
        target: /usr/share/elasticsearch/config/elasticsearch.yml
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic

networks:
  elastic:
    driver: bridge

elasticsearch.yml

node.name: es01
cluster.name: es-docker-cluster
discovery.seed_hosts: es02,es03
cluster.initial_master_nodes: es01,es02,es03
bootstrap.memory_lock: true
ES_JAVA_OPTS: "-Xms512m -Xmx512m"

因此,我可以使用 node.name=${container_nane} 代替 node.name=es01 吗?

【问题讨论】:

  • 我不确定我是否理解正确。首先,您对所有内容使用相同的elasticsearch.yml 文件,因此node.name 对所有服务都是相同的。其次,Docker 无法更改外部文件。您的目标可以完成,但需要编写脚本,但这在 Docker 之外。

标签: docker docker-compose elastic-stack


【解决方案1】:

elasticsearch Environment variable substitution:

配置文件中使用 ${...} 符号引用的环境变量将替换为环境变量的值。例如:

node.name:    ${HOSTNAME}
network.host: ${ES_NETWORK_HOST}

所以,你需要为docker-compose.yaml中的每个容器设置hostname,那么默认情况下每个容器都会有环境变量HOSTNAME,它会被elasticsearch.yml自动选择:

version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.14.0
    container_name: es01
    hostname: es01

并且,在elasticsearch.yml 中,如文档中所述,您需要使用node.name: ${HOSTNAME}

【讨论】:

  • 我能知道它需要大写还是可以跟 docker compose 一样?
  • docker-compose.yaml 中使用hostname,而在elasticsearch.yml 中使用${HOSTNAME}
  • 嗨,我该如何解决它是选择正确的值吗?我试过 docker exec check elasticsearch.yml not working
  • elasticsearch.yaml 不会更改,替换会即时进行。所以你可以用docker logs your_container_id | grep node\.name确认,在那个容器的启动日志中,你可以找到node.name的信息,检查一下。
  • The default node.name is the hostname 并且您不需要在配置文件中手动设置它。
猜你喜欢
  • 2021-10-16
  • 2021-06-03
  • 1970-01-01
  • 2017-08-23
  • 2019-09-09
  • 1970-01-01
  • 2020-03-14
  • 2020-06-23
  • 1970-01-01
相关资源
最近更新 更多