oracle - 使用卷时,将文件从 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中添加的完全一样
解决方案
我猜:
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 驱动程序一样。那是有区别的。驱动程序文件的权限。
推荐阅读
- docker - GitLab CI/CD Docker-In-Docker 使用自定义 DIND 服务失败
- git - 无法在 Github 上为 pip install git+ssh 指定密钥文件
- c++ - 关于解决方案 C++ 的成对交换节点链表混淆
- r - 如果它是一个字符串,有没有办法在 R 中按月分组?
- random - 程序生成和排列问题
- dialogflow-es - 当用户重复问题时,如何创建一般的后备意图?
- python - 如何以numpy数组格式分割图片?
- python - 如何用另一个数据框的值过滤掉一个数据框并根据出现次数收集统计信息?
- javascript - 如何在不使用原始 Javascript 重定向的情况下发布表单?
- python - 如何从 Django Request 对象中提取路径参数?