Docker部署Solr:schema.xml挂载及动态更新权限问题求助
Docker部署Solr:权限错误与动态配置更新解决方案
问题背景
在自定义电商网站中使用Docker部署Solr,期望通过脚本更新网站生成的schema,再调用Solr API重载core。但存在两个核心问题:
- 本地用户与容器内Solr运行用户权限不匹配,绑定挂载文件时触发权限错误
- 当前启动脚本仅能完成初始化配置复制,无法实现配置的动态更新
现有配置
docker-compose.yml 片段
solr: image: wg_solr build: solr_conf/ ports: - 8985:8983 volumes: - ./solr_conf/configure.sh:/configure.sh - solr_data:/var/solr - ./solr_conf/${COMPOSE_PROJECT_NAME}:/wg/conf healthcheck: test: ["CMD-SHELL", "curl -f http://localhost:8983/solr/wg/admin/ping | grep \"OK\" || exit 1"] interval: 10s timeout: 3s retries: 3 command: - /configure.sh - wg - /wg/conf
configure.sh 启动脚本
#!/bin/bash set -o pipefail source run-initdb CORE=$1 default_config_dir="/opt/solr/server/solr/configsets/_default/conf" coresdir=/var/solr/data coredir="$coresdir/$CORE" precreate-core $CORE $2 echo "Copy default config from $default_config_dir to $coredir" cp -rp "$default_config_dir/lang/" "$coredir" cp -rp "$default_config_dir/protwords.txt" "$default_config_dir/stopwords.txt" "$default_config_dir/synonyms.txt" "$coredir" solr-create -c wg
解决方案
1. 修复权限错误
方式一:调整挂载目录所有者
在configure.sh开头添加权限修正命令,确保容器内Solr用户(默认UID/GID为8983,用户名为solr)拥有挂载目录的读写权限:
# 修正挂载目录权限 chown -R solr:solr /wg/conf
方式二:指定容器运行用户
在docker-compose.yml的solr服务中添加user字段,直接使用solr用户运行容器:
solr: # ...其他配置 user: solr
2. 实现动态配置更新
当前脚本仅在容器启动时复制配置,无法同步本地修改。可通过以下两种方式解决:
方案A:让Solr直接读取挂载的配置目录
修改core的配置,使其直接使用挂载的/wg/conf,而非复制到/var/solr/data。在precreate-core执行后,修改core的属性文件:
# 修改core配置,指向挂载的配置目录 echo "configDir=/wg/conf" >> "$coredir/core.properties"
此后本地修改./solr_conf/${COMPOSE_PROJECT_NAME}下的文件后,直接调用Solr API重载core即可生效:
curl -X POST "http://localhost:8985/solr/wg/admin/cores?action=RELOAD&core=wg"
方案B:自动监听配置变化并重载core
- 在容器内安装文件监听工具
inotify-tools,修改Dockerfile:
FROM solr:latest # 安装inotify-tools RUN apt-get update && apt-get install -y inotify-tools && rm -rf /var/lib/apt/lists/* # 复制自定义脚本 COPY configure.sh /configure.sh COPY watch-config.sh /watch-config.sh RUN chmod +x /configure.sh /watch-config.sh
- 创建
watch-config.sh监听脚本:
#!/bin/bash # 监听配置目录变化,自动重载core while inotifywait -r -e modify,create,delete /wg/conf; do curl -X POST "http://localhost:8983/solr/wg/admin/cores?action=RELOAD&core=wg" done
- 修改
configure.sh,在末尾添加后台运行监听脚本的命令:
# 后台启动配置监听脚本 nohup /watch-config.sh & # 启动Solr前台进程 exec solr start -f
3. 优化启动脚本(整合版)
#!/bin/bash set -o pipefail source run-initdb CORE=$1 default_config_dir="/opt/solr/server/solr/configsets/_default/conf" coresdir=/var/solr/data coredir="$coresdir/$CORE" # 修正挂载目录权限 chown -R solr:solr /wg/conf # 预创建core precreate-core $CORE $2 # 配置core直接使用挂载的配置目录 echo "configDir=/wg/conf" >> "$coredir/core.properties" # 复制默认词典文件到挂载目录(若本地已维护这些文件可省略) cp -rp "$default_config_dir/lang/" "/wg/conf/" cp -rp "$default_config_dir/protwords.txt" "$default_config_dir/stopwords.txt" "$default_config_dir/synonyms.txt" "/wg/conf/" # 启动配置监听脚本 nohup /watch-config.sh & # 启动Solr前台进程(确保容器能正常接收信号) exec solr start -f
内容的提问来源于stack exchange,提问作者Hugo Delannoy
相关产品推荐
相关产品推荐

