You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker Compose中Elasticsearch持久化卷挂载路径配置问题

解决Docker Compose中Elasticsearch数据卷挂载到指定宿主机路径的问题

你的问题出在对Docker Compose中命名卷绑定挂载的用法混淆上。原来的配置里,es-data:/mt/sda/es-data是把命名卷es-data挂载到容器内的/mt/sda/es-data路径,而非将宿主机的/mt/sda/es-data作为数据卷使用。下面提供两种可行的解决方案:

方案一:使用绑定挂载(直接映射宿主机目录)

这是最直接的方式,跳过Docker的命名卷管理,直接将宿主机的目录映射到Elasticsearch容器的默认数据目录(/usr/share/elasticsearch/data):

  1. 修改docker-compose.ymlvolumes部分:
version: "3.0"
services:
  elasticsearch:
    container_name: elastic-container-rescue
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    volumes:
      # 替换为宿主机路径:容器内数据目录
      - /mt/sda/es-data:/usr/share/elasticsearch/data
    environment:
      - xpack.security.enabled=true
      - "discovery.type=single-node"
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - "network.host=0.0.0.0"
      - ELASTIC_PASSWORD=$ES_PASS
    ports:
      - 9300:9200
    networks:
      - elastic
networks:
  elastic:
    driver: bridge
# 移除原来的命名卷定义,因为我们用绑定挂载
  1. 提前在宿主机创建目录并设置正确权限(Elasticsearch容器内运行用户的UID是1000):
mkdir -p /mt/sda/es-data
chown -R 1000:1000 /mt/sda/es-data
chmod -R 750 /mt/sda/es-data
  1. 重启容器生效:
docker-compose down && docker-compose up -d

方案二:配置命名卷的自定义挂载点

如果你想保留命名卷的管理方式,同时指定宿主机的路径,可以通过local驱动的driver_opts来配置:

  1. 修改docker-compose.ymlvolumes定义:
version: "3.0"
services:
  elasticsearch:
    container_name: elastic-container-rescue
    image: docker.elastic.co/elasticsearch/elasticsearch:7.15.0
    volumes:
      # 命名卷挂载到容器内的默认数据目录
      - es-data:/usr/share/elasticsearch/data
    environment:
      - xpack.security.enabled=true
      - "discovery.type=single-node"
      - "ES_JAVA_OPTS=-Xms1g -Xmx1g"
      - "network.host=0.0.0.0"
      - ELASTIC_PASSWORD=$ES_PASS
    ports:
      - 9300:9200
    networks:
      - elastic
networks:
  elastic:
    driver: bridge
volumes:
  es-data:
    driver: local
    driver_opts:
      type: none
      o: bind
      device: /mt/sda/es-data
  1. 同样需要提前创建目录并设置权限:
mkdir -p /mt/sda/es-data
chown -R 1000:1000 /mt/sda/es-data
chmod -R 750 /mt/sda/es-data
  1. 先删除原来的命名卷(如果已经创建),再重启容器:
docker volume rm rescue-es_es-data
docker-compose down && docker-compose up -d

此时执行docker volume inspect rescue-es_es-data,就能看到Mountpoint已经是/mt/sda/es-data了。

关键注意事项

  • 权限问题:必须确保宿主机目录的权限正确,否则Elasticsearch容器会因无法写入数据目录而启动失败。
  • 数据迁移:如果之前的命名卷已有数据,需要先将/var/lib/docker/volumes/rescue-es_es-data/_data下的文件复制到/mt/sda/es-data,再删除旧卷。
  • 磁盘挂载确认:确保/mt/sda磁盘已经正确挂载到宿主机,且有足够的存储空间。

内容的提问来源于stack exchange,提问作者Mr Moon

火山引擎 最新活动