Folks, please let me know what you think of my proposal below.

PROBLEM:
Today in Docker (and probably the Linux installer), the solr home dir in
/var/solr/... is initialized with solr.xml, zoo.cfg and log4j2.xml [1].
Consequently, if you deploy new Docker images of Solr with updated built-in
configurations (e.g. with your company/project settings), the old
configuration is *still* used.  This is in conflict with the "immutable
infrastructure"[2] principle in which the deployable unit (Docker image)
contains as much configuration as possible (and immutably) to avoid issues
like this and snowflake server configuration.  Configuration in a mutable
place like ZooKeeper or the file system is problematic for upgrades, and so
reducing what we put in both is helpful.

[1]:
https://github.com/apache/solr/blob/main/solr/docker/scripts/init-var-solr
[2]: https://www.bmc.com/blogs/immutable-infrastructure/

At work I worked around this by editing my Dockerfile to have
SOLR_HOME=/opt/solr/server/solr and editing my solr.xml coreRootDirectory
to point to /var/solr/data.  Since I also use embedded ZK in tests, I
needed to pass -DzkServerDataDir=/var/solr/zoo_data.  Overall this was easy
but I'd like to propose Solr running this way auto-magically in Docker and
via the Unix installer script.

PROPOSAL:
Add an env var SOLR_VAR that both Docker and the Linux installer will set
to /var/solr.  When this is set, aspects of SolrXmlConfig, the loader of
solr.xml, will resolve some defaults relative to SOLR_VAR.  If the
directory or file is present in SOLR_VAR then it will use that, if it's in
SOLR_HOME, it will use that.  Otherwise, try to create it in SOLR_VAR
assuming SOLR_VAR exists.

Furthermore, the coreRootDirectory shall have a default relative dir of
"data", NOT empty/blank as is now.  This will separate cores from other
stuff like configSets, userFiles, fileStore.

~ David Smiley
Apache Lucene/Solr Search Developer
http://www.linkedin.com/in/davidwsmiley

Reply via email to