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

时间:2019-10-11 11:26:09

标签: docker solr docker-compose

我们需要将Solr切换到docker容器。在我们核心的数据配置中,我们的配置如下:

class MyForm : Form
{
    // Note that `TaskCompletionSource` must have a generic-type argument.
    // If you don't care about the result then use a dummy null `Object` or 1-byte `Boolean` value.
    private TaskCompletionSource<Button> tcs;

    private readonly Button button;

    public MyForm()
    {
        this.button = new Button() { Text = "Click me" };
        this.Controls.Add( this.button );
        this.button.Click += this.OnButtonClicked;
    }

    private void OnButtonClicked( Object sender, EventArgs e )
    {
        if( this.tcs == null ) return;

        this.tcs.SetResult( (Button)sender );
    }

    internal async Task BatchLogicAsync()
    {
        this.tcs = new TaskCompletionSource<Button>();

        ProgressMessage = "Batch Logic Starts";

        Button clickedButton = await this.tcs.Task;

        ProgressMessage = "Batch Logic Ends";
    }
}

和在solrconfig.xml中

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

<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 compose文件中传递@...@变量的值吗?

谢谢。

2 个答案:

答案 0 :(得分:1)

为解决此问题,我准备了自己的solr映像,并添加了一个特殊的append.solr.sh并将其附加到/opt/solr/bin/solr.in.sh。内核使用我在dataSource部分的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

Dockerfile

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"

答案 1 :(得分:0)

您可以在数据导入配置文件中访问 JVM 系统属性,系统属性可以通过环境变量 SOLR_OPTS 进行设置,如 here 所述。

<块引用>

任何 JVM 系统属性,通常在启动 JVM 时使用 -D 标志指定,可以用作 Solr 中任何 XML 配置文件中的变量。

<块引用>

一般来说,您想要设置的任何 Java 系统属性都可以使用标准的 -Dproperty=value 语法通过 bin/solr 脚本传递。或者,您可以将通用系统属性添加到 Solr 包含文件(bin/solr.in.shbin/solr.in.cmd)中定义的 SOLR_OPTS 环境变量

因此您实际上不需要编写自己的 Dockerfile,而只需使用 solr 映像并像这样设置环境变量 SOLR_OPTS

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