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

如何修改Dockerfile与docker-compose.yml预创建Solr Core并映射本地目录

解决Solr 5.5 Docker容器预创建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

但遇到两个问题:

  1. 构建容器时报错:

ERROR: Service 'solr' failed to build: The command '/bin/sh -c solr create -c drupal-search -p 8983' returned a non-zero code: 1

  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目录下创建必要的配置文件:

  1. 临时启动一个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
    
  2. 调整本地目录权限,避免容器内权限报错:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 07:51:44