Set Environment-Specific Configuration with Docker - Bloomreach Experience - Open Source CMS
17-09-2020

Set Environment-Specific Configuration with Docker

Introduction

Goal

Configure a Bloomreach Experience Manager Docker image for a specific environment.

Background

To facilitate running on different platforms with various configurations, the Bloomreach Experience Manager Docker image contains several configuration variables such as repository variables, several JVM variables, and Tomcat variables.

Default Environment-Specific Configuration with Docker

Default system and environment variables are set both in dockerFile in the docker image and in the setenv.sh bash file that is used to set environment variables in a Tomcat instance.

The following variables are set in dockerFile by default:

# Default JVM heap size variables
ENV JAVA_MINHEAP "256m"
ENV JAVA_MAXHEAP "512m"

# Default tomcat http max threads variable
ENV TOMCAT_MAXTHREADS "200"

# Default repository settings
ENV REPO_PATH "${docker.brxm.project.path}/target/storage"
ENV REPO_CONFIG ""
ENV REPO_BOOTSTRAP "false"
ENV REPO_AUTOEXPORT_ALLOWED "false"

# Default database profile
ENV profile "h2"

Other system and environment variables are set in setenv.sh bash file in Tomcat’s bin folder as follows:

# Repository configurations
REP_OPTS="-Drepo.path=${REPO_PATH} -Drepo.bootstrap=${REPO_BOOTSTRAP} -Drepo.config=${REPO_CONFIG} -Drepo.autoexport.allowed=${REPO_AUTOEXPORT_ALLOWED}"

# Logging configurations
L4J_OPTS="-Dlog4j.configurationFile=file://${CATALINA_HOME}/conf/log4j2.xml -DLog4jContextSelector=org.apache.logging.log4j.core.selector.BasicContextSelector"

# JVM heap size options
JVM_OPTS="-server -Xms${JAVA_MINHEAP} -Xmx${JAVA_MAXHEAP} -XX:+UseG1GC -Djava.util.Arrays.useLegacyMergeSort=true"

# JVM garbage Collector options
VGC_OPTS="-verbosegc -XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:${CATALINA_HOME}/logs/gc.log -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2048k"

# JVM heapdump options
DMP_OPTS="-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=${CATALINA_HOME}/temp"

CATALINA_OPTS="${JVM_OPTS} ${VGC_OPTS} ${REP_OPTS} ${DMP_OPTS} ${L4J_OPTS}"
If it takes very long to start Tomcat and the following trace is in the log:
WARNING [main] org.apache.catalina.util.SessionIdGeneratorBase.createSecureRandom Creation of SecureRandom instance for session ID generation using [SHA1PRNG] took [214,052] milliseconds.

Adding -Djava.security.egd=file:/dev/./urandom in the setenv.sh file will prevent it.

Check the Tomcat wiki for more information.

Setting Environment-Specific Configuration with Docker

If you use the docker.run Maven profile to run the Docker image, you can set the following environment variables to docker.run profile configuration:

<profile>
  <id>docker.run</id>
  <properties>
    <docker.brxm.envRun.JAVA_MINHEAP>512</docker.brxm.envRun.JAVA_MINHEAP>  
    <docker.brxm.envRun.JAVA_MAXHEAP>1024</docker.brxm.envRun.JAVA_MAXHEAP>   
    <docker.brxm.envRun.TOMCAT_MAXTHREADS>250</docker.brxm.envRun.TOMCAT_MAXTHREADS>
    <docker.brxm.envRun.REPO_PATH>/usr/local/tomcat/repo</docker.brxm.envRun.REPO_PATH>
    <docker.brxm.envRun.REPO_CONFIG>file:/usr/local/tomcat/conf/repository-mysql.xml</docker.brxm.envRun.REPO_CONFIG>
    <docker.brxm.envRun.REPO_BOOTSTRAP>false</docker.brxm.envRun.REPO_BOOTSTRAP>
    <docker.brxm.envRun.REPO_AUTOEXPORT_ALLOWED>false</docker.brxm.envRun.REPO_AUTOEXPORT_ALLOWED>
    <docker.brxm.envRun.REPO_WORKSPACE_BUNDLE_CACHE>512</docker.brxm.envRun.REPO_WORKSPACE_BUNDLE_CACHE>
    <docker.brxm.envRun.REPO_VERSIONING_BUNDLE_CACHE>128</docker.brxm.envRun.REPO_VERSIONING_BUNDLE_CACHE>
    ... 
  </properties>
  ...
​</profile>

Or you can pass them on the command-line using as system properties:

mvn -Pdocker.run -DREPO_PATH=/usr/local/tomcat/repo -DTOMCAT_MAXTHREADS=250

You can also set the environment variables by passing parameters to the docker run command:

docker run -e REPO_PATH=‘/usr/local/tomcat/repo’ -e TOMCAT_MAXTHREADS=‘250’ -e profile='mysql' …

Setting Jackrabbit Cluster Node Id with Docker

When the Bloomreach Experience Manager application runs in a clustered environment, the Jackrabbit cluster node ID should be set properly. Each node must have a unique cluster node id in the cluster. In the default docker configuration, the Jackrabbit cluster node ID is set with the hostname of the container. If you need to change the default value, you can define a new value by setting the REPO_CLUSTER_NODE_ID environment variable.

Define REPO_CLUSTER_NODE_ID in the docker.run profile configuration:

<profile>
  <id>docker.run</id>
  <properties>
    ...
    <docker.brxm.envRun.REPO_CLUSTER_NODE_ID>custom-node-id</docker.brxm.envRun.REPO_CLUSTER_NODE_ID>
    ...
  </properties>
  ...
</profile>

or pass it on the command-line using as system property:

mvn -Pdocker.run -DREPO_CLUSTER_NODE_ID=custom-node-id

Provide a Stored Lucene Index

When starting a new container to connect to an existing Bloomreach Experience Manager cluster, a new local lucene index must be generated during the startup process. This can be very time-consuming for a large or long-lived repository. To accelerate this part of the startup process, a container can be seeded with an existing lucene index that was exported from an existing cluster node. See the Lucene Index Export docs for more information.

As of Bloomreach Experience Manager version 14.3.0, the default Dockerfile provided by the project archetype supports using an existing lucene index at container startup. To use this, a zip file produced by the Lucene Index Export plugin must be available on the new container's file system, typically by mapping it to a container volume. Set the location of the index zip file in the environment variable LUCENE_INDEX_FILE_PATH.

Required Environment Variables to Run the Image With a Database In Non-Development Environment

Several environment variables are supposed to be set to run the Bloomreach Experience Manager docker image with a MySQL or a Postgres database instance. The environment variable named profile defines which database type the Bloomreach Experience Manager container will connect to. The profile variable can have one of the following values: h2, mysql, postgres.

As an example, to run the Bloomreach Experience Manager image with a mysql database, a sample docker compose file is as follows:

version: “3"
services:
  web:
    image: org.example/myproject:0.1.0-SNAPSHOT
    ports:
      - "8080:8080"
    networks:
      - webnet
    depends_on:
      - mysql
    environment:
     - profile=mysql
  mysql:
    image: mysql
    ports:
      - "3306:3306"
    networks:
      - webnet
    environment:
      - MYSQL_ROOT_PASSWORD=admin   
      - MYSQL_DATABASE=docklog
      - MYSQL_USER=admin
      - MYSQL_PASSWORD=admin
networks:
  webnet:

The other environment variables that are required to run the image with a database are set in Dockerfile. The default values of these environment variables are as follows. 

# Default mysql variables
ENV MYSQL_DB_HOST mysql
ENV MYSQL_DB_PORT 3306
ENV MYSQL_DB_USER admin
ENV MYSQL_DB_PASSWORD admin
ENV MYSQL_DB_NAME myproject
ENV MYSQL_DB_DRIVER com.mysql.cj.jdbc.Driver

# Default postgres variables
ENV POSTGRES_DB_HOST postgres
ENV POSTGRES_DB_PORT 5432
ENV POSTGRES_DB_USER admin
ENV POSTGRES_DB_PASSWORD admin
ENV POSTGRES_DB_NAME myproject
ENV POSTGRES_DB_DRIVER org.postgresql.Driver
Did you find this page helpful?
How could this documentation serve you better?
On this page
    Did you find this page helpful?
    How could this documentation serve you better?