如何修改Dockerfile与docker-compose.yml预创建Solr Core并映射本地目录
我尝试用以下docker-compose.yml和Dockerfile构建Solr 5.5容器,目的是预创建Core并将Core目录映射到本地:
docker-compose.yml:
version: "2" services: solr: container_name: test.solr #image: solr:5.5 build: .build/solr ports: - "8983:8983" volumes: - ./data/solr:/opt/solr/server/solr
Dockerfile:
FROM solr:5.5 WORKDIR /opt/solr RUN solr create -c drupal-solr
但遇到两个问题:
- 构建容器时报错:
ERROR: Service 'solr' failed to build: The command '/bin/sh -c solr create -c drupal-search -p 8983' returned a non-zero code: 1
- 移除
solr create命令后容器能构建,但启动时退出并报错:
Solr home directory /opt/solr/server/solr must contain a solr.xml file!
问题原因分析
- 构建阶段创建Core失败:Docker镜像构建阶段(
RUN指令执行时),Solr服务并未启动,solr create命令需要连接运行中的Solr实例才能执行,直接在构建阶段调用自然会失败。 - 启动时缺失solr.xml:你直接把本地空目录
./data/solr映射到容器的Solr Home目录(/opt/solr/server/solr),而Solr启动必须依赖该目录下的solr.xml配置文件,空目录无法满足这个要求。
解决方案
我们需要调整Dockerfile和docker-compose.yml,在容器启动时初始化Core,同时确保Solr Home目录有必要的配置文件,并且正确映射本地目录。
步骤1:修改Dockerfile,添加启动时初始化Core的脚本
创建自定义entrypoint脚本,在Solr启动完成后自动创建Core。
更新后的Dockerfile:
FROM solr:5.5 # 复制自定义entrypoint脚本到容器内 COPY entrypoint.sh /opt/solr/bin/ # 给脚本添加执行权限 RUN chmod +x /opt/solr/bin/entrypoint.sh # 设置默认Core名称(可根据需求修改) ENV SOLR_CORE_NAME=drupal-solr # 指定自定义entrypoint ENTRYPOINT ["/opt/solr/bin/entrypoint.sh"] # 默认启动命令,保持Solr前台运行 CMD ["solr", "-f"]
在.build/solr目录下创建entrypoint.sh脚本:
#!/bin/bash # 启动Solr服务 exec /opt/solr/bin/solr start -p 8983 # 等待Solr完全启动(根据实际情况调整等待时间) sleep 10 # 检查目标Core是否存在,不存在则创建 if ! /opt/solr/bin/solr list -p 8983 | grep -q "$SOLR_CORE_NAME"; then /opt/solr/bin/solr create -c "$SOLR_CORE_NAME" -p 8983 fi # 切换为前台运行Solr,保持容器存活 exec /opt/solr/bin/solr -f
步骤2:初始化本地Solr Home目录
在本地./data/solr目录下创建必要的配置文件:
- 临时启动一个Solr容器,复制默认的
solr.xml到本地:docker run --rm -d --name temp-solr solr:5.5 docker cp temp-solr:/opt/solr/server/solr/solr.xml ./data/solr/ docker stop temp-solr - 调整本地目录权限,避免容器内权限报错:
chmod -R 777 ./data/solr
步骤3:调整docker-compose.yml
确保volumes映射正确,也可以选择单独映射Core的数据目录(方便单独管理):
version: "2" services: solr: container_name: test.solr build: .build/solr ports: - "8983:8983" volumes: # 映射整个Solr Home目录,包含solr.xml和所有Core数据 - ./data/solr:/opt/solr/server/solr # 可选:单独映射目标Core的目录,更精细化管理 # - ./data/solr/drupal-solr:/opt/solr/server/solr/drupal-solr environment: # 传递Core名称给entrypoint脚本 - SOLR_CORE_NAME=drupal-solr
验证运行
执行以下命令构建并启动容器:
docker-compose build docker-compose up -d
等待容器启动完成后,访问http://localhost:8983/solr,就能看到预创建的drupal-solr Core,所有数据都会持久化到本地./data/solr目录中。
内容的提问来源于stack exchange,提问作者Chito Cheng

