将文件从 url 添加到 docker 图像在使用音量时以不同的结果结束

Add a file from url to docker image is ends in different result when using volume

我想将 Keycloak 最新版本 (14.0.0) Docker 图像与 Oracle JDBC 一起使用,据我所知 jboss/keycloak:14.0.0 图像不随 Oracle JDBC driver.

首先,我将 driver 作为 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 命令可以从 Web 获取资源并添加到图像中

这就是我想出的:

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 Thread Pool -- 70) Error during startup: java.lang.RuntimeException: Failed to connect to database

所以 Keycloak 应用程序的行为就像没有 Oracle JDBC driver 一样,只要我像以前一样将 driver 作为一个卷添加回来,它就可以完美地工作。

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

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

jdbc 目录中的 jar 与我在 Docker 文件

中添加的完全相同

我的猜测:

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

In the case where <src> is a remote file URL, the destination will have permissions of 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 驱动程序存在一样。这是一个区别。驱动程序文件的权限。