2 min read

Sitecore Docker - increase SOLR JVM

Sitecore Docker - increase SOLR JVM

By default the solr containers that get started will be assigned 512MB of memory.  
For the project we are migrating we have several custom indexes and we could use some more memory when all those need to be reindexed.

After a short investigation round, I found my way around to increase it.
There could be better/other ways to do this. If you know, please let me know!

I've configured it to be 1.5GB. This setting can be configured however you want off course.

My solution was to override the Start.ps1 script that gets executed once the Sitecore nonproduction Solr container starts.

The most important task of that PowerShell script is c:\solr\bin\solr.cmd start -port $SolrPort -f

With a custom DockerFile, we can overwrite that file and set the memory to the amount that we want:

c:\solr\bin\solr.cmd start -port $SolrPort -f -m 1536m

The process

I created my solr build folder and added the Dockerfile and Start.ps1 script.  
Where I got that script? From the image itself. Read here how you can do this

The Dockerfile doesn't do that much, it will only copy the Start.ps1 file and override the file that is already in the Base Image.

# escape=`

ARG BASE_IMAGE

FROM ${BASE_IMAGE}

SHELL ["powershell", "-Command", "$ErrorActionPreference = 'Stop'; $ProgressPreference = 'SilentlyContinue';"]

COPY Start.ps1 C:\Start.ps1

This is the complete Start.ps1 script. Notice the -m flag in the last line.

param(
    [Parameter(Mandatory = $true)]
    [ValidateScript( { Test-Path $_ -PathType 'Container' })]
    [string]$InstallPath,
    
    [Parameter(Mandatory = $true)]
    [ValidateScript( { Test-Path $_ -PathType 'Container' })]
    [string]$DataPath,

    [Parameter(Mandatory = $true)]
    [string]$SolrPort
)

$dataPathToTest = Join-Path $DataPath solr.xml
if (Test-Path $dataPathToTest) {
    Write-Host "INFO: Existing Solr configuration found in '$DataPath'..."
}
else {
    Write-Host "INFO: Solr configuration not found in '$DataPath', copying clean configuration..."
    Copy-Item $InstallPath\** $DataPath -Recurse -Force -ErrorAction SilentlyContinue
}

c:\solr\bin\solr.cmd start -port $SolrPort -f -m 1536m

Off-course don't forget that your docker-compose.override.yml file needs to reference the build context (the folder that contains the Dockerfile).

 # Mount our Solr data folder
  solr:
    build:
      context: ./docker/build/solr
      args:
        BASE_IMAGE: ${SITECORE_DOCKER_REGISTRY}nonproduction/solr:8.4.0-${SITECORE_VERSION}
    mem_limit: 2GB
    volumes:
      - ${LOCAL_DATA_PATH}\solr:c:\data

Next, is to build the image: docker-compose build --no-cache

And spin everything up. And you'll get a solr running with the amount of memory that you wanted!


This was tested with the following Sitecore docker image: scr.sitecore.com/sxp/nonproduction/solr:8.4.0-10.1.0-ltsc2019