I am trying to create a docker image with Sql server JDBC Driver.
However I am getting this error:
Caused by: java.lang.ClassNotFoundException: Unable to load class: com.microsoft.sqlserver.jdbc.SQLServerDriver from ClassLoader:java.net.URLClassLoader@71423665;ClassLoader:java.net.URLClassLoader@71423665
at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:56)
at org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:281)
... 41 more
Caused by: java.lang.ClassNotFoundException: com.microsoft.sqlserver.jdbc.SQLServerDriver
at java.base/java.net.URLClassLoader.findClass(URLClassLoader.java:471)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:588)
at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:521)
at java.base/java.lang.Class.forName0(Native Method)
at java.base/java.lang.Class.forName(Class.java:398)
at org.apache.tomcat.jdbc.pool.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:38)
... 42 more
My Docker file is like this:
FROM alpine:3.10 as builder
ARG VERSION=7.12.0
ARG DISTRO=tomcat
ARG SNAPSHOT=true
ARG EE=false
ARG USER
ARG PASSWORD
RUN apk add --no-cache \
ca-certificates \
maven \
tar \
wget \
xmlstarlet
COPY settings.xml download.sh camunda-tomcat.sh camunda-wildfly.sh /tmp/
RUN /tmp/download.sh
##### FINAL IMAGE #####
FROM alpine:3.10
ARG VERSION=7.12.0
#MSSQL SERVER JDBC DRIVER INSTALL
COPY sqljdbc_7.4.1.0_enu.tar.gz /tmp/
WORKDIR /tmp
RUN tar -xf sqljdbc_7.4.1.0_enu.tar.gz
RUN export CLASSPATH="$CLASSPATH:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar"
ENV CAMUNDA_VERSION=${VERSION}
ENV DB_DRIVER=com.microsoft.sqlserver.jdbc.SQLServerDriver
ENV DB_URL=jdbc:sqlserver://xx.database.windows.net:1433;database=camundadb;user=demo@xx;password=xxx.;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;
ENV DB_USERNAME=
ENV DB_PASSWORD=
ENV DB_CONN_MAXACTIVE=20
ENV DB_CONN_MINIDLE=5
ENV DB_CONN_MAXIDLE=20
ENV DB_VALIDATE_ON_BORROW=false
ENV DB_VALIDATION_QUERY="SELECT 1"
ENV SKIP_DB_CONFIG=
ENV WAIT_FOR=
ENV WAIT_FOR_TIMEOUT=120
ENV TZ=UTC
ENV DEBUG=TRUE
ENV JAVA_OPTS="-Xmx768m -XX:MaxMetaspaceSize=256m"
EXPOSE 8080 8000
# Downgrading wait-for-it is necessary until this PR is merged
# https://github.com/vishnubob/wait-for-it/pull/68
RUN apk add --no-cache \
bash \
ca-certificates \
openjdk11-jre-headless \
tzdata \
tini \
xmlstarlet \
&& wget -O /usr/local/bin/wait-for-it.sh \
"https://raw.githubusercontent.com/vishnubob/wait-for-it/a454892f3c2ebbc22bd15e446415b8fcb7c1cfa4/wait-for-it.sh" \
&& chmod +x /usr/local/bin/wait-for-it.sh
RUN addgroup -g 1000 -S camunda && \
adduser -u 1000 -S camunda -G camunda -h /camunda -s /bin/bash -D camunda
WORKDIR /camunda
USER camunda
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["./camunda.sh"]
COPY --chown=camunda:camunda --from=builder /camunda .
Update 1:
I removed the export line and added:
ENV CLASSPATH ${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar ARG CLASSPATH=${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar
based on other SO questions, I tried also the jre11 and jre12 versions of the driver, but still have the same error, unable to load class.
Update 2:
According to Camunda documentation here: https://github.com/camunda/docker-camunda-bpm-platform
Java Versions Our docker images are using the latest LTS OpenJDK version supported by Camunda BPM. This currently means:
Camunda 7.12 will be based on OpenJDK 11 All previous versions are based on OpenJDK 8
According to Microsoft documentation here: https://learn.microsoft.com/en-us/sql/connect/jdbc/system-requirements-for-the-jdbc-driver?view=sql-server-2017
Microsoft JDBC Driver 7.4 for SQL Server:
The JDBC Driver 7.4 includes three JAR class libraries in each installation package: mssql-jdbc-7.4.1.jre8.jar, mssql-jdbc-7.4.1.jre11.jar, and mssql-jdbc-7.4.1.jre12.jar.
The JDBC Driver 7.4 is designed to work with and be supported by all major Java virtual machines, but is tested only on OpenJDK 1.8, OpenJDK 11.0, OpenJDK 12.0, Azul Zulu JRE 1.8, Azul Zulu JRE 11.0, and Azul Zulu JRE 12.0.
version 7.4 is supported by OpenJDK
that RUN export CLASSPATH="$CLASSPATH:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar"
will has no effect in your dockerfile
:
instead you need to use ENV
for runtime and ARG
for build:
ENV CLASSPATH ${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar
ARG CLASSPATH=${CLASSPATH}:/tmp/sqljdbc_7.4/enu/mssql-jdbc-7.4.1.jre8.jar