Driver not found for postgres database in docker reference application

Hi everyone. I’m trying to run a dockerised reference application connected to a postgres database which is hosted in heroku.

The reference application docker setup has been created with the openmrs-sdk (mvn openmrs-sdk:build-distro -e -Ddistro=src/main/resources/openmrs-distro.properties). My openmrs-distro.properties file only contains the modules for the reference application and the basic properties (db.h2.supported=false, name, version and war.openmrs), so it’s a pretty default one which is working fine with the default maria-db that the sdk puts in the docker compose.

I’ve changed the docker compose and the startup.sh files to look like this:

docker-compose.yml

# Generated automatically by openmrs SDK
version: '2'

services:
  web:
    build: web
    image: referenceapplication:latest
    environment:
      DB_HOST: {the host of the heroku db}
      DB_CREATE_TABLES: 'true'  # change to 'true' if using an empty database
      DB_AUTO_UPDATE: 'true'    # change to 'true' if using an empty database
      MODULE_WEB_ADMIN: 'true'   # allow web admin on OpenMRS
      OMRS_CONFIG_CONNECTION_USERNAME: {the user of the heroku db}
      OMRS_CONFIG_CONNECTION_PASSWORD: {the password of the heroku db}
      OMRS_CONFIG_CONNECTION_TYPE: postgresql
      OMRS_CONFIG_CONNECTION_DRIVER_CLASS: org.postgresql.Driver
      OMRS_CONFIG_CONNECTION_URL: jdbc:postgres://{the user of the heroku db}:{the password of the heroku db}@{the host of the heroku db}/{the database of the heroku db}?sslmode=require
    volumes:
      - web-data:/usr/local/tomcat/.OpenMRS
      - /usr/local/tomcat/.OpenMRS/modules/ # used to mount persistent docker volume for modules
      - /usr/local/tomcat/.OpenMRS/owa/     # used to mount persistent docker volume for owa

volumes:
  web-data:

startup.sh

...
cat > /usr/local/tomcat/openmrs-server.properties << EOF
install_method=auto
connection.url=${OMRS_CONFIG_CONNECTION_URL}
connection.username=${OMRS_CONFIG_CONNECTION_USERNAME}
connection.password=${OMRS_CONFIG_CONNECTION_PASSWORD}
connection.driver_class=${OMRS_CONFIG_CONNECTION_DRIVER_CLASS}
has_current_openmrs_database=true
create_database_user=false
module_web_admin=${MODULE_WEB_ADMIN}
create_tables=${DB_CREATE_TABLES}
auto_update_database=${DB_AUTO_UPDATE}
EOF
...
/usr/local/tomcat/wait-for-it.sh --timeout=3600 ${DB_HOST}:5432
...

You can see I’ve basically changed the environment variables related to the database and the port when calling the wait-for-it.sh script. I’ve also removed the database part in the docker-compose.override.yml file.

The error I’m getting is driver not found, here are the logs of the container:

11-Aug-2022 07:42:49.022 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version name:   Apache Tomcat/8.5.81
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server built:          Jun 8 2022 21:30:15 UTC
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Server version number: 8.5.81.0
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Name:               Linux
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log OS Version:            5.10.109-0-virt
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Architecture:          amd64
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Java Home:             /opt/java/openjdk
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Version:           1.8.0_342-b07
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log JVM Vendor:            Temurin
11-Aug-2022 07:42:49.029 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_BASE:         /usr/local/tomcat
11-Aug-2022 07:42:49.030 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log CATALINA_HOME:         /usr/local/tomcat
11-Aug-2022 07:42:49.030 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.config.file=/usr/local/tomcat/conf/logging.properties
11-Aug-2022 07:42:49.030 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager
11-Aug-2022 07:42:49.030 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dfile.encoding=UTF-8
11-Aug-2022 07:42:49.030 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xms256m
11-Aug-2022 07:42:49.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Xmx768m
11-Aug-2022 07:42:49.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:PermSize=256m
11-Aug-2022 07:42:49.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -XX:MaxPermSize=512m
11-Aug-2022 07:42:49.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djdk.tls.ephemeralDHKeySize=2048
11-Aug-2022 07:42:49.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.protocol.handler.pkgs=org.apache.catalina.webresources
11-Aug-2022 07:42:49.031 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dorg.apache.catalina.security.SecurityListener.UMASK=0027
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -agentlib:jdwp=transport=dt_socket,address=1044,server=y,suspend=n
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -DOPENMRS_INSTALLATION_SCRIPT=/usr/local/tomcat/openmrs-server.properties
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -DOPENMRS_APPLICATION_DATA_DIRECTORY=/usr/local/tomcat/.OpenMRS
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dignore.endorsed.dirs=
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.base=/usr/local/tomcat
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Dcatalina.home=/usr/local/tomcat
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.startup.VersionLoggerListener.log Command line argument: -Djava.io.tmpdir=/usr/local/tomcat/temp
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent Loaded Apache Tomcat Native library [1.2.33] using APR version [1.7.0].
11-Aug-2022 07:42:49.032 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [{4}].
11-Aug-2022 07:42:49.033 INFO [main] org.apache.catalina.core.AprLifecycleListener.lifecycleEvent APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
11-Aug-2022 07:42:49.038 INFO [main] org.apache.catalina.core.AprLifecycleListener.initializeSSL OpenSSL successfully initialized [OpenSSL 3.0.2 15 Mar 2022]
11-Aug-2022 07:42:49.203 INFO [main] org.apache.coyote.AbstractProtocol.init Initializing ProtocolHandler ["http-nio-8080"]
11-Aug-2022 07:42:49.236 INFO [main] org.apache.catalina.startup.Catalina.load Initialization processed in 1132 ms
11-Aug-2022 07:42:49.314 INFO [main] org.apache.catalina.core.StandardService.startInternal Starting service [Catalina]
11-Aug-2022 07:42:49.314 INFO [main] org.apache.catalina.core.StandardEngine.startInternal Starting Servlet engine: [Apache Tomcat/8.5.81]
11-Aug-2022 07:42:49.374 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deploying web application archive [/usr/local/tomcat/webapps/openmrs.war]
11-Aug-2022 07:42:49.394 WARNING [localhost-startStop-1] org.apache.catalina.startup.SetContextPropertiesRule.begin [SetContextPropertiesRule]{Context} Setting property 'antiJARLocking' to 'true' did not find a matching property.
11-Aug-2022 07:42:53.640 INFO [localhost-startStop-1] org.apache.jasper.servlet.TldScanner.scanJars At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
07:42:54.367 [localhost-startStop-1] ERROR org.openmrs.api.context.Context - serviceContext is null.  Creating new ServiceContext()
WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2033) |2022-08-11T07:42:54,597| Unable to find a runtime properties file at /usr/local/tomcat/openmrs-runtime.properties
WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2033) |2022-08-11T07:42:54,620| Unable to find a runtime properties file at /usr/local/tomcat/openmrs-runtime.properties
INFO - Listener.contextInitialized(185) |2022-08-11T07:42:54,620| Using runtime properties file: /usr/local/tomcat/.OpenMRS/openmrs-runtime.properties
WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2033) |2022-08-11T07:42:54,626| Unable to find a runtime properties file at /usr/local/tomcat/openmrs-runtime.properties
INFO - ChangeLogDetective.getInitialLiquibaseSnapshotVersion(69) |2022-08-11T07:42:54,788| identifying the Liquibase snapshot version that had been used to initialize the OpenMRS database...
INFO - ChangeLogDetective.getInitialLiquibaseSnapshotVersion(82) |2022-08-11T07:42:54,793| looking for un-run change sets in snapshot version '2.5.x'
ERROR - UpdateFilterModel.updateChanges(100) |2022-08-11T07:42:54,800| Unable to get the database changes
java.lang.Exception: Unable to get a connection to the database.  Please check your openmrs runtime properties file and make sure you have the correct connection.username and connection.password set
        at org.openmrs.util.DatabaseUpdater.getLiquibase(DatabaseUpdater.java:402) ~[openmrs-api-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.util.DatabaseUpdater.getLiquibase(DatabaseUpdater.java:382) ~[openmrs-api-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.util.DatabaseUpdaterLiquibaseProvider.getLiquibase(DatabaseUpdaterLiquibaseProvider.java:25) ~[openmrs-api-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.liquibase.ChangeLogDetective.getInitialLiquibaseSnapshotVersion(ChangeLogDetective.java:88) ~[openmrs-api-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.util.DatabaseUpdater.getUnrunDatabaseChanges(DatabaseUpdater.java:638) ~[openmrs-api-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.web.filter.update.DatabaseUpdaterWrapper.getUnrunDatabaseChanges(DatabaseUpdaterWrapper.java:18) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.web.filter.update.UpdateFilterModel.updateChanges(UpdateFilterModel.java:92) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.web.filter.update.UpdateFilterModel.<init>(UpdateFilterModel.java:71) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.web.filter.update.UpdateFilterModel.<init>(UpdateFilterModel.java:57) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.web.filter.update.UpdateFilter.init(UpdateFilter.java:496) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281) ~[catalina.jar:8.5.81]
        at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262) ~[catalina.jar:8.5.81]
        at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:105) ~[catalina.jar:8.5.81]
        at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4608) ~[catalina.jar:8.5.81]
        at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5258) ~[catalina.jar:8.5.81]
        at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:183) ~[catalina.jar:8.5.81]
        at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:753) ~[catalina.jar:8.5.81]
        at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:727) ~[catalina.jar:8.5.81]
        at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:695) ~[catalina.jar:8.5.81]
        at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:1016) ~[catalina.jar:8.5.81]
        at org.apache.catalina.startup.HostConfig$DeployWar.run(HostConfig.java:1903) ~[catalina.jar:8.5.81]
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[?:1.8.0_342]
        at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[?:1.8.0_342]
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[?:1.8.0_342]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[?:1.8.0_342]
        at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_342]
Caused by: java.sql.SQLException: No suitable driver found for {the value of the connection.url}
        at java.sql.DriverManager.getConnection(DriverManager.java:689) ~[?:1.8.0_342]
        at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:1.8.0_342]
        at org.openmrs.util.DatabaseUpdater.getConnection(DatabaseUpdater.java:461) ~[openmrs-api-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.util.DatabaseUpdater.getLiquibase(DatabaseUpdater.java:399) ~[openmrs-api-2.6.0-SNAPSHOT.jar:?]
        ... 25 more
INFO - ChangeLogDetective.getInitialLiquibaseSnapshotVersion(69) |2022-08-11T07:42:54,809| identifying the Liquibase snapshot version that had been used to initialize the OpenMRS database...
INFO - ChangeLogDetective.getInitialLiquibaseSnapshotVersion(82) |2022-08-11T07:42:54,809| looking for un-run change sets in snapshot version '2.5.x'
WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2033) |2022-08-11T07:42:55,030| Unable to find a runtime properties file at /usr/local/tomcat/openmrs-runtime.properties
11-Aug-2022 07:42:55.052 INFO [localhost-startStop-1] org.apache.catalina.startup.HostConfig.deployWAR Deployment of web application archive [/usr/local/tomcat/webapps/openmrs.war] has finished in [5,677] ms
11-Aug-2022 07:42:55.066 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler ["http-nio-8080"]
11-Aug-2022 07:42:55.101 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 5864 ms
+ curl -L http://localhost:8080/openmrs/
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
WARN - OpenmrsUtil.getRuntimePropertiesFilePathName(2033) |2022-08-11T07:43:03,134| Unable to find a runtime properties file at /usr/local/tomcat/openmrs-runtime.properties
WARN - InitializationFilter.verifyConnection(987) |2022-08-11T07:43:03,143| Error while checking the connection user account
java.sql.SQLException: No suitable driver found for {the value of the connection.url}
        at java.sql.DriverManager.getConnection(DriverManager.java:689) ~[?:1.8.0_342]
        at java.sql.DriverManager.getConnection(DriverManager.java:247) ~[?:1.8.0_342]
        at org.openmrs.web.filter.initialization.InitializationFilter.verifyConnection(InitializationFilter.java:977) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.web.filter.initialization.InitializationFilter.access$400(InitializationFilter.java:80) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at org.openmrs.web.filter.initialization.InitializationFilter$InitializationCompletion$1.run(InitializationFilter.java:1495) ~[openmrs-web-2.6.0-SNAPSHOT.jar:?]
        at java.lang.Thread.run(Thread.java:750) ~[?:1.8.0_342]
100 12464    0 12464    0     0  15102      0 --:--:-- --:--:-- --:--:--     0
+ sleep 15
+ wait 18

Thanks a lot!

Could you try removing the user and password from the URL parameter? It should just be in the format: jdbc:postgres://host/db?options.

Hi Ian! Thanks for your answer. I have tried that right now and still the same result. Driver not found.

I thought that might be the case, but always easiest to start from there…

java.sql.SQLException: No suitable driver found for {the value of the connection.url}

Are you using {the value of the connection.url} instead of the actual driver

Hi!, ok I’m just plain dumb. I was using postgres as the driver instead of postgresql. Sorry for the inconvinience!

1 Like