" />
文章

Elasticsearch Docker 容器启动报错排查

tElasticsearch:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.2
    container_name: tElasticsearch
    environment:
      - "discovery.type=single-node"
      - "ES_JAVA_OPTS=-Xms1024m -Xmx1024m"
      - http.cors.enabled=true
      - http.cors.allow-origin=*
      - "xpack.security.enabled=true"
      - "xpack.security.transport.ssl.enabled=false"
      - "ELASTIC_PASSWORD=P4wLpETyQ76zQikBBWyI"
    volumes:
      - /home/thought/data/elasticsearch:/usr/share/elasticsearch/data
      - /home/thought/plugin/elasticsearch:/usr/share/elasticsearch/plugins
      - /home/thought/etc/elasticsearch/config:/usr/share/elasticsearch/config
    ports:
      - 9200:9200
      - 9300:9300
    networks:
      - common-network

将本地目录/home/thought/data/elasticsearch映射到容器内的/usr/share/elasticsearch/data目录。Elasticsearch容器默认以elasticsearch用户(非root)启动,因此该用户需对数据目录有写权限,否则会报AccessDeniedException,无法获取锁定文件node.lock。

请尝试以下步骤来解决问题:

  1. 确保宿主机上的数据目录有正确的权限和属主:
    在宿主机执行:

bash sudo chown -R 1000:1000 /home/thought/data/elasticsearch sudo chmod -R 775 /home/thought/data/elasticsearch

(1000:1000是elasticsearch镜像中elasticsearch用户的默认UID:GID)

执行完后,重新启动容器。

  1. 检查是否存在遗留的node.lock文件:
    如果之前有失败的启动尝试导致node.lock文件残留,可以在宿主机下删除对应数据目录中的node.lock文件,然后再重新启动。

bash rm /home/thought/data/elasticsearch/nodes/0/node.lock

  1. 确认没有其他Elasticsearch实例使用相同的数据目录:
    如果你需要多节点,请给每个节点指定独立的数据目录或者在elasticsearch.yml中增加node.max_local_storage_nodes的数量。

通常,第一步(修正权限)即可解决大多数该类问题。

docker exec -it tElasticsearch /bin/bash

/usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto --batch



root@cbb698e9e7df:/usr/share/elasticsearch# /usr/share/elasticsearch/bin/elasticsearch-setup-passwords auto --batch

Changed password for user apm_system
PASSWORD apm_system = zBTVfDL1oljE1jjo3hwT

Changed password for user kibana_system
PASSWORD kibana_system = OO8zVppcuV0cLNpOyYz1

Changed password for user kibana
PASSWORD kibana = OO8zVppcuV0cLNpOyYz1

Changed password for user logstash_system
PASSWORD logstash_system = 4kv1D52l8IWjaJ0PxHGA

Changed password for user beats_system
PASSWORD beats_system = cJfAzJFsqS89gpWCLFUr

Changed password for user remote_monitoring_user
PASSWORD remote_monitoring_user = uVWJ44iJTGjd1A8Jab7e

Changed password for user elastic
PASSWORD elastic = llj94deAHXkD66oesW1D
curl -X POST "http://tElasticsearch:9200/_security/user/elastic/_password" \
-H "Content-Type: application/json" \
-u elastic:现有的正确密码 \
-d '{"password": "P4wLpETyQ76zQikBBWyI"}'

License:  CC BY 4.0