将文件从 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 驱动程序存在一样。这是一个区别。驱动程序文件的权限。
我想将 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 驱动程序存在一样。这是一个区别。驱动程序文件的权限。