首页 > 解决方案 > 使用卷时,将文件从 url 添加到 docker 图像以不同的结果结束

问题描述

我想将 Keycloak 最新版本 (14.0.0) Docker 映像与 Oracle JDBC 一起使用,据我所知,jboss/keycloak:14.0.0该映像不附带 Oracle JDBC 驱动程序。

首先,我将驱动程序作为 docker-compose 文件中的卷添加到正确的目录中。

  keycloak:
    image: jboss/keycloak:14.0.0
    ports:
      - 9080:8080
      - 9443:8443
    networks:
      - bifrost
    environment:
      ...
    volumes:
      - ./jdbc:/opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver
    depends_on:
      oracle-db:
        condition: service_healthy

我将文件下载到jdbc目录中,并将 jar 重命名ojdbc.jar为他们在描述中推荐的内容。

它运行良好,直到我尝试将其推送到远程,由于文件太大,远程 git 主机光荣地拒绝了它。我们无法更改此限制,因此我能找到的最佳解决方案是构建图像,因为ADD命令可以从网络获取资源并添加到图像中

所以这就是我想出的:

FROM jboss/keycloak:14.0.0

ADD https://repo1.maven.org/maven2/com/oracle/database/jdbc/ojdbc8/12.2.0.1/ojdbc8-12.2.0.1.jar /opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver/ojdbc.jar

docker-sompose.yml

  keycloak:
    build:
      context: ./keycloak
    ports:
      - 9080:8080
      - 9443:8443
    networks:
      - bifrost
    environment:
      ...
    depends_on:
      oracle-db:
        condition: service_healthy

但是,使用此解决方案 Keycloak 无法启动,它总是失败并出现以下错误

11:54:39,493 FATAL [org.keycloak.services](ServerService 线程池 -- 70)启动时出错:java.lang.RuntimeException:无法连接到数据库

因此,Keycloak 应用程序的行为就像不存在 Oracle JDBC 驱动程序一样,只要我像以前一样将驱动程序添加回卷,它就可以完美运行。

我完全不知道为什么会这样,这两种情况有什么区别?

据我所知,应该没有任何区别,并且在两种情况下都应该可以正常工作。

dir中的jarjdbc和我在Dockerfile中添加的完全一样

标签: oracledockerjdbcdocker-composekeycloak

解决方案


我猜:

https://docs.docker.com/engine/reference/builder/#add

如果 <src> 是远程文件 URL,则目标的权限为 600。

测试:

$ ls -lah  /opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver/ojdbc.jar
-rw------- 1 root root 3.9M Feb 21  2020 /opt/jboss/keycloak/modules/system/layers/base/com/oracle/jdbc/main/driver/ojdbc.jar

来自官方 Docker 镜像的 Keycloak 在用户 ID下运行1000,而不是在root用户下运行。因此 Keycloak 看不到下载的驱动程序,并且 Keycloak 应用程序的行为就像不存在 Oracle JDBC 驱动程序一样。那是有区别的。驱动程序文件的权限。


推荐阅读