Docker部署ElasticSearch遇FileSystemException:非目录错误求助
问题
作为Docker与ElasticSearch新手,按照教程使用以下docker-compose.yml部署ElasticSearch集群:
version: "4.6" services: es01: image: "docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2" ports: - "9200:9200" - "9300:9300" environment: node.name: es01 discovery.seed_hosts: es01,es02,es03 cluster.initial_master_nodes: es01,es02,es03 cluster.name: mycluster bootstrap.memory_lock: "true" ES_JAVA_OPTS: -Xms256m -Xmx256m volumes: - "es-data-es01:/usr/share/elasticsearch/data" ulimits: memlock: soft: -1 hard: -1 healthcheck: test: ["CMD-SHELL", "curl http://localhost:9200"] interval: 10s timeout: 10s retries: 120 es02: image: "docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2" ports: - "9201:9200" - "9301:9300" environment: node.name: es02 discovery.seed_hosts: es01,es02,es03 cluster.initial_master_nodes: es01,es02,es03 cluster.name: mycluster bootstrap.memory_lock: "true" ES_JAVA_OPTS: -Xms256m -Xmx256m volumes: - "es-data-es02:/usr/share/elasticsearch/data" ulimits: memlock: soft: -1 hard: -1 healthcheck: test: ["CMD-SHELL", "curl http://localhost:9200"] interval: 10s timeout: 10s retries: 120 es03: image: "docker.elastic.co/elasticsearch/elasticsearch-oss:7.10.2" ports: - "9202:9200" - "9303:9300" environment: node.name: es03 discovery.seed_hosts: es01,es02,es03 cluster.initial_master_nodes: es01,es02,es03 cluster.name: mycluster bootstrap.memory_lock: "true" ES_JAVA_OPTS: -Xms256m -Xmx256m volumes: - "es-data-es03:/usr/share/elasticsearch/data" ulimits: memlock: soft: -1 hard: -1 healthcheck: test: ["CMD-SHELL", "curl http://localhost:9200"] interval: 10s timeout: 10s retries: 120 kibana: image: docker.elastic.co/kibana/kibana-oss:7.10.2 depends_on: es01: condition: service_healthy es02: condition: service_healthy es03: condition: service_healthy ports: - "5601:5601" environment: - 'ELASTICSEARCH_HOSTS=["http://es01:9200","http://es02:9200","http://es03:9200"]' volumes: es-data-es01: es-data-es02: es-data-es03:
运行docker compose时出现FileSystemException错误,报错信息如下:
api-es03-1 | "stacktrace": ["org.elasticsearch.bootstrap.StartupException: ElasticsearchException[failed to bind service]; nested: FileSystemException[/usr/share/elasticsearch/data/nodes/0: Not a directory];", api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:174) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.execute(Elasticsearch.java:161) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.cli.EnvironmentAwareCommand.execute(EnvironmentAwareCommand.java:86) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.cli.Command.mainWithoutErrorHandling(Command.java:127) ~[elasticsearch-cli-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.cli.Command.main(Command.java:90) ~[elasticsearch-cli-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:126) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:92) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "Caused by: org.elasticsearch.ElasticsearchException: failed to bind service", api-es03-1 | "at org.elasticsearch.node.Node.<init>(Node.java:729) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.node.Node.<init>(Node.java:289) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.bootstrap.Bootstrap$5.<init>(Bootstrap.java:227) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.bootstrap.Bootstrap.setup(Bootstrap.java:227) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:393) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "at org.elasticsearch.bootstrap.Elasticsearch.init(Elasticsearch.java:170) ~[elasticsearch-7.10.2.jar:7.10.2]", api-es03-1 | "... 6 more",
预期ElasticSearch服务能正常启动,寻求解决方法。
解决方法
这个错误是因为ElasticSearch容器无法在指定数据目录下创建必要的子目录,通常是命名卷存在异常或权限问题,按以下步骤处理:
清理异常卷并重启
- 停止所有容器:
docker compose down - 查看所有Docker卷,找到对应项目的ES数据卷:
docker volume ls - 删除出问题的
es-data-es03卷(或全部三个ES数据卷彻底重置):docker volume rm <你的项目名>-es-data-es03 - 重新启动集群:
docker compose up -d
启动后用
docker compose logs -f es03查看日志,确认是否正常启动。- 停止所有容器:
添加权限初始化命令(可选)
如果不想频繁删除卷,可以在每个ES服务的配置中添加命令,确保容器内数据目录权限正确:es03: # 其他配置不变 command: > bash -c "chown -R elasticsearch:elasticsearch /usr/share/elasticsearch/data && exec /usr/local/bin/docker-entrypoint.sh eswrapper"该命令会在启动ElasticSearch前,先修正数据目录的所属用户权限。
绑定挂载目录的额外处理(若后续切换为本地目录)
如果后续改用宿主机本地目录挂载而非命名卷,需提前创建目录并设置正确权限:mkdir -p ./es-data/es03 chown -R 1000:1000 ./es-data/es03再修改
volumes配置为:volumes: - "./es-data/es03:/usr/share/elasticsearch/data"
内容的提问来源于stack exchange,提问作者Bharat Soni
相关产品推荐
相关产品推荐

