some weird issues regarding docker

序言

在docker容器中有时会遇到一些特别奇怪的问题.这里整理记录一下我觉得奇怪的问题cuiyaonan2000@163.com,持续更新

替换JDK不生效

一般来说我们替换一个自带jdk镜像的jdk版本的时候只需要设置

bash 复制代码
export JAVA_HOME=/opt/java/jdk8
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

因为我们之前在非容器的系统上就是这么设置的,但是在容器中可能会发现替换总是不成功,在运行是java 总是指向原来的java版本.cuiyaonan2000@163.com

为什么常规配置会失效

1. PATH 只负责"找到门",不负责"进门后做什么"

  • 作用PATH 告诉系统去哪里找 java 这个可执行文件。
  • 现状 :你的 PATH 已经配对了,系统成功找到了 /opt/java/jdk8/bin/java 这个文件(那个 15KB 的启动器)。
  • 局限 :一旦程序开始运行,PATH 的任务就结束了。它管不了程序运行时需要加载哪些 .so 动态链接库。

2. JAVA_HOME 只是给应用看的"路标"

  • 作用:这是一个约定俗成的变量,告诉 Maven、Tomcat 等工具 JDK 装在哪。
  • 局限 :操作系统底层的加载器并不直接读取 JAVA_HOME。除非程序内部写了代码去读取这个变量并手动拼接路径,否则操作系统根本不知道它的存在。

3. LD_LIBRARY_PATH 才是操作系统的"导航仪"

  • 作用 :这是操作系统层面的环境变量。当那个 15KB 的启动器试图加载 JVM 核心库时,它会直接问操作系统:"嘿,libjvm.so 在哪?"
  • 机制 :操作系统会优先检查 LD_LIBRARY_PATH
    • 如果不设 :操作系统按默认顺序找,结果找到了系统自带的 JDK 21 的库 -> 版本错误
    • 如果设了 :操作系统在你的指引下,找到了 JDK 8 目录下的库 -> 版本正确

4. 解决方案

bash 复制代码
 // 将 JDK 8 的库路径放在最前面,强制覆盖系统默认路径
    LD_LIBRARY_PATH = "/opt/java/jdk8/lib/amd64:/opt/java/jdk8/lib/amd64/server:${env.LD_LIBRARY_PATH}"
相关推荐
数据智研3 小时前
【数据分享】300个城市-5G试点城市DID数据(2014-2025)
大数据·运维·人工智能·信息可视化·数据分析
honsor3 小时前
工业级网口温湿度变送器 ModbusTCP 机房动环环境监测终端
运维·网络·人工智能·物联网·安全·云计算·智能温湿度监测系统
fengkai45454 小时前
八、Docker详解1-3
运维·docker·容器
流浪0014 小时前
Linux系统篇34——信号(六):信号处理期间又来了怎么办?——sigaction、sa_mask、可重入函数与 volatile
linux·运维·面试·操作系统·信号处理·信号
学烹饪的小胡桃4 小时前
资产设备管理系统 WGFIX 怎么设置https访问
linux·运维·服务器·网络·安全
一技安身4 小时前
【信创】银河麒麟V10(ARM64,无GPU纯CPU)内网隔离离线部署Deepseek+openWebUI完整方案
docker
志栋智能5 小时前
超自动化巡检如何生成“有灵魂”的运维报告?
大数据·运维·人工智能·架构·自动化
凌风的跨境分享5 小时前
Temu运营避坑指南:制造地点信息填写合规要点与批量优化方法
运维·服务器·人工智能
AI视觉网奇5 小时前
docker 迁移
docker
Splashtop高性能远程控制软件5 小时前
微软 2026 年 9 月补丁星期二技术分析:974 个漏洞的分级修复优先级清单
运维·安全·自动化·远程工作·splashtop