提问人:Frederik Bo Dahl 提问时间:3/2/2023 更新时间:3/9/2023 访问量:68
Dockerized Solr 找不到 requestHandlers
Dockerized Solr cannot find requestHandlers
问:
我目前正在从事一个具有 PostgreSQL、Redis、Medusa 和 Solr 实现的项目。
我想以容器化方式运行所有应用程序,以便我可以轻松地将其部署到我的 Linux 服务器。
我的问题是,当我尝试从我的运行容器化的Solr实例时,它最终无法找到我创建的。docker-compose.yml
Request Handlers
当我访问在 localhost:8983 上运行的管理 GUI 时,我能够看到我的核心并运行请求处理程序。
在 GUI 中,当我打开文件下的核心(称为 product_core)时,我看到一个完全不同的目录。/select
似乎我无法让我的 Solr 实例找到我自己的 solrconfig.xml 文件,即使它们已复制到映像中。
当我进入我的Solr实例时,我可以看到。docker exec -it solr /bin/bash
在目录中的 Solr 实例中:我可以看到 GUI 显示的文件,但我似乎无法让它工作以复制文件。/var/solr/data/product_core
以下是我的docker-compose.yml文件:
version: "3.8"
services:
backend:
build:
context: ./medusa_backend
dockerfile: Dockerfile
image: dahlfrederik/medusa_backend
container_name: medusa_backend
depends_on:
- postgres
- redis
environment:
DATABASE_URL: postgresql://postgres:alpha123@postgres:5432/postgres
REDIS_URL: redis://redis:6379/
NODE_ENV: development
JWT_SECRET: some_jwt_secret
COOKIE_SECRET: some_cookie_secret
PORT: 9000
ADMIN_CORS: http://localhost:7000,http://localhost:7001,http://192.168.98.141:7000,http://localhost:7000
STORE_CORS: http://localhost:3000,http://192.168.98.141:8000,http://localhost:8000
MEDUSA_DISABLE_TELEMETRY: "true"
volumes:
- ./medusa_backend/data:/var/lib/postgresql/data
ports:
- "9000:9000"
restart: always
postgres:
image: postgres:10.4
container_name: postgres
ports:
- "5432:5432"
volumes:
- ./postgres/data:/var/lib/postgresql/data
restart: always
environment:
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=alpha123
- POSTGRES_DB=postgres
redis:
image: redis
container_name: redis
expose:
- 6379
restart: always
admin:
build:
context: ./medusa_admin
dockerfile: Dockerfile
image: dahlfrederik/medusa_admin
container_name: medusa_admin
depends_on:
- backend
environment:
HOST: 0.0.0.0
PORT: 7000
ports:
- "7000:7000"
restart: always
storefront:
build:
context: ./nextjs_frontend
dockerfile: Dockerfile
image: dahlfrederik/medusa_storefront
container_name: storefront
depends_on:
- backend
environment:
PORT: 8000
ports:
- "8000:8000"
restart: always
solr:
image: solr
container_name: solr
depends_on:
- postgres
ports:
- "8983:8983"
volumes:
- data:/var/solr
- ./solr:/opt/solr/server/solr/product_core
entrypoint:
- docker-entrypoint.sh
- solr-precreate
- product_core
restart: always
volumes:
data:
我的 Solr 配置文件位于目录 Solr 中,该目录位于包含我的 docker-compose 文件的文件夹中。
我创建了一个如下managed-schema.xml
<?xml version="1.0" encoding="UTF-8" ?>
<schema name="default-config" version="1.6">
<field name="id" type="string" indexed="true" stored="true" required="true" multiValued="false" />
<field name="title" type="text_general" indexed="true" stored="true" />
<field name="description" type="text_general" indexed="true" stored="true" />
<field name="type" type="string" indexed="true" stored="true" />
<field name="size" type="string" indexed="true" stored="true" />
<field name="price" type="string" indexed="true" stored="true" />
<field name="image" type="string" indexed="false" stored="true" />
<field name="inStock" type="boolean" indexed="false" stored="true" />
<uniqueKey>id</uniqueKey>
<fieldType name="string" class="solr.StrField" />
<fieldType name="text_general" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" />
<filter class="solr.LowerCaseFilterFactory"/>
<filter class="solr.ASCIIFoldingFilterFactory"/>
</analyzer>
</fieldType>
<fieldType name="boolean" class="solr.BoolField" />
</schema>
我创建了一个solrconfig.xml,如下所示:
<?xml version="1.0" encoding="UTF-8" ?>
<config>
<requestHandler name="/search" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">100</int>
<str name="fl">id,title,description,type,size,price,image,inStock</str>
<str name="facet">true</str>
<str name="facet.mincount">1</str>
<str name="facet.field">size</str>
<str name="facet.field">price</str>
<str name="facet.field">color</str>
</lst>
<lst name="invariants">
<str name="defType">edismax</str>
<str name="qf">title^2 description</str>
</lst>
<arr name="last-components">
<str>facet</str>
</arr>
</requestHandler>
<requestHandler name="/autocomplete_search" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">all</str>
<str name="df">text</str>
<int name="rows">10</int>
<str name="fl">title,image</str>
</lst>
</requestHandler>
<searchComponent name="facet">
<lst name="facet">
<bool name="facet.sort">true</bool>
<lst name="facet.field">
<str name="field">size</str>
<bool name="facet.missing">true</bool>
<bool name="facet.sort">false</bool>
<int name="facet.limit">-1</int>
</lst>
<lst name="facet.range">
<str name="field">price</str>
<int name="mincount">1</int>
<str name="method">dv</str>
</lst>
<lst name="facet.field">
<str name="field">color</str>
</lst>
</lst>
</searchComponent>
<requestHandler name="/select" class="solr.SearchHandler">
<lst name="defaults">
<str name="echoParams">explicit</str>
<int name="rows">10</int>
<str name="fl">id,title,description,type,size,price</str>
<str name="facet">true</str>
<str name="facet.mincount">1</str>
<str name="facet.field">size</str>
<str name="facet.field">price</str>
<str name="facet.field">color</str>
</lst>
<arr name="last-components">
<str>facet</str>
</arr>
</requestHandler>
<updateRequestProcessorChain name="uuid">
<processor class="solr.UUIDUpdateProcessorFactory">
<str name="fieldName">id</str>
</processor>
<processor class="solr.LogUpdateProcessorFactory"/>
<processor class="solr.RunUpdateProcessorFactory"/>
</updateRequestProcessorChain>
</config>
因此,我似乎以某种方式将文件复制到错误的目的地 - 但是当我尝试将其复制到Solr GUI中可以看到的目的地时,它找不到我的核心。
提前感谢您的任何建议。
我试图更改存储配置文件的目录。 我试过docker-compose up --build -d。 尝试在docker-compose.yml文件中更改为使用入口点而不是命令
答:
事实证明,我的问题是配置文件保存在我的 docker 实例中的错误位置 - 我通过添加一个虚拟文本文件然后使用 Linux 搜索命令查找该文件及其位置来解决这个问题。HelloWorld.txt
我通过将脚本添加到我的 Azure 生成/部署管道来解决我的问题,该脚本将我的 solr-conf 文件夹的内容复制到我的 docker 实例,然后运行 reload core 命令。
因此,我的解决方案是运行一个执行以下命令的脚本:
docker cp {path-to-my-solr-config-folder]\solr\conf\. solr:/var/solr/data/{core-name]/conf
然后我执行以下 post 命令。
curl -X POST http://localhost:8983/solr/admin/cores?action=RELOAD&core={core-name}
它可能可以更直观地完成,我仍在考虑将命令直接添加到我的文件中。但就目前而言,这是解决我问题的一种方式。docker-compose.yml
评论