如何将 SQLite JDBC 驱动程序包含到 docker 图像?

How to include SQLite JDBC driver to docker image?

我尝试创建一个 docker servlet 应用程序映像,它使用 SQLite 数据库或 xml 存储数据并 tomcat 设置应用程序。它在环境变量中定义了应用程序使用的存储类型。当我使用 xml 时一切正常,但是当我尝试切换到 db 时,应用程序看不到我提供的 JDBC 驱动程序。我尝试使用不同的方法来提供它,我在创建 WAR 文件之前将它添加到 WEB-INF/lib 目录,我试图将它复制到 Docker 文件中的 /usr/local/tomcat/lib 目录,我试图将它作为一个卷安装,但没有任何效果。我仍然得到同样的错误:

java.sql.SQLException: No suitable driver found for jdbc:sqlite:/build/library.db
at java.sql.DriverManager.getConnection(DriverManager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.java:270)
at library.LibrarySQLDAO.<init>(LibrarySQLDAO.java:103)
at library.AuthorServlet.doGet(AuthorServlet.java:216)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:634)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:199)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:651)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:501)
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:754)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1376)
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:748)

Docker文件看起来像这样

FROM tomcat:9.0-alpine
COPY LibraryWeb.war /usr/local/tomcat/webapps/
COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml
COPY library.db build/library.db
COPY library.xml build/library.xml
COPY sqlite-jdbc-3.36.0.3.jar /usr/local/tomcat/lib/sqlite-jdbc-3.36.0.3.jar
EXPOSE 8080
ENV XML_FILE_LOCATION=build/library.xml
ENV SQLITE_FILE_LOCATION=build/library.db
ENV STORAGE_ENGINE=sql
CMD ["catalina.sh","run"]

现在我不知道我做错了什么,请给我提示。我也是 Java 和 Docker 的新手。我也知道在容器中包含数据存储不是一个好主意,但现在我想让它正常工作,然后我会考虑如何正确提供数据存储。

  1. 从 sqlite-jdbc-3.36.0.3.jar
  2. 中提取 libsqlitejdbc.so
  3. 复制libsqlitejdbc.so到/usr/lib

示例:

RUN unzip -j sqlite-jdbc-*.jar "org/sqlite/native/$(uname -s)/$(uname -m)/libsqlitejdbc.so"
RUN mv libsqlitejdbc.so /usr/lib