通过环境变量配置docker容器的solr数据导入

Configure solr's dataimport of docker container by enviroments variables

我们需要将 solr 切换到 docker 容器。在我们核心的数据配置中,我们有这样的配置:

<dataSource type="JdbcDataSource"
            driver="org.postgresql.Driver"
            url="${dataimporter.request.db_url}"
            user="${dataimporter.request.db_user}"
            password="${dataimporter.request.db_pass}" />

并在 solrconfig.xml

  <requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
    <lst name="defaults">
      <str name="config">data-config.xml</str>
      <str name="db_url">@db.jdbcurl@</str>
      <str name="db_user">@db.username@</str>
      <str name="db_pass">@db.pass@</str>
    </lst>
  </requestHandler>

@...@ 变量是从 Maven 属性设置的。你能告诉我如何在 docker 撰写文件中传递 @...@ 变量的值吗?

谢谢。

为了解决这个问题,我准备了自己的 solr 图像,并添加了一个特殊的 append.solr.sh 附加到 /opt/solr/bin/solr.in.sh。核心使用我在数据源部分的 append.solr.sh 中定义的 java 属性。


我准备了一个 append.solr.sh 文件:

# Our specific configs.
EXTRA_OPTIONS="-Djava.system.database=$DB_TARGET -Djava.system.dbport=$DB_PORT -Djava.system.dbuser=$DB_USERNAME -Djava.system.dbpass=$DB_PASSWORD"
SOLR_OPTS="$SOLR_OPTS $EXTRA_OPTIONS"
FROM solr

EXPOSE 8983

USER root
COPY append.solr.sh /append.solr.sh
RUN cat /append.solr.sh >> /opt/solr/bin/solr.in.sh \
    && rm /append.solr.sh

COPY --chown=solr:solr cores /opt/solr/server/solr/mycores

USER solr

WORKDIR /opt/solr

ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["solr-foreground"]

像这样修改我的核心的数据源:

<dataSource
    type="JdbcDataSource"
    driver="com.sap.db.jdbc.Driver"
    url="jdbc:sap://${java.system.database}:${java.system.dbport}"
    user="${java.system.dbuser}"
    password="${java.system.dbpass}" />

并将我的 docker-compose.yml 更改为如下所示:

version: '3.7'
services:
  search:
    image: mysolr:latest
    container_name: mysolr
    build:
      context: ./search
      dockerfile: Dockerfile
    environment:
      - DB_TARGET
      - DB_PORT
      - DB_USERNAME
      - DB_PASSWORD

最后,我生成了一个包含这些变量的 .env 文件。


编辑 - 匹配您的设置的替代解决方案:

docker-compose.yml

version: "3.6"
  services:
    postgres:
      image: postgres:11-alpine
      ports:
        - "5435:5432"
      environment:
        - POSTGRES_DB=${ENV_DB}
        - POSTGRES_USER=${ENV_PASS}
        - POSTGRES_PASSWORD=${ENV_USER}
      volumes:
        - ./etc/db-init/ddl.sql:/docker-entrypoint-initdb.d/1-ddl.sql
        - ./etc/db-init/dml.sql:/docker-entrypoint-initdb.d/2-dml.sql
        - pg_data:/var/lib/postgresql/data

    solr:
      build: ./etc/.
      ports:
        - "8983:8983"
      environment:
        - db_url=${ENV_JDBC}
        - db_user=${ENV_USER}
        - db_password=${ENV_PASS}
      volumes:
        - solr_data:/var/solr/data
      depends_on:
        - postgres
volumes:
  pg_data:
  solr_data:

.env

ENV_USER=os
ENV_PASS=heslo
ENV_DB=os
ENV_JDBC=jdbc:postgresql://localhost:5432/os

Docker 文件

FROM solr:8.2
USER root
COPY pgdriver/postgresql-42.2.8.jar /opt/solr/dist/
COPY solr/ /opt/solr/server/solr/ 
CMD "/opt/solr/bin/solr start -Ddb_url=$db_url -Ddb_user=$db_user -Ddb_password=$db_password -s /opt/solr/server/solr -f -force"

您可以在 dataimport 配置文件中访问 JVM 系统属性,并且可以通过环境变量 SOLR_OPTS 设置系统属性,如 here.

所述

Any JVM System properties, usually specified using the -D flag when starting the JVM, can be used as variables in any XML configuration file in Solr.

In general, any Java system property that you want to set can be passed through the bin/solr script using the standard -Dproperty=value syntax. Alternatively, you can add common system properties to the SOLR_OPTS environment variable defined in the Solr include file (bin/solr.in.sh or bin/solr.in.cmd)

所以你实际上不需要编写自己的 Dockerfile,只需使用 solr 图像并像这样设置环境变量SOLR_OPTS

SOLR_OPTS="-Ddataimporter.request.db_url=$DB_URL -Ddataimporter.request.db_user=$DB_USER -Ddataimporter.request.db_pass=$DB_PASSWORD"