You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

  1. 在容器内安装文件监听工具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
  1. 创建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
  1. 修改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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 11:33:15