Docker Desktop 构建java8基础镜像jdk安装配置失效解决

Docker Desktop 构建java8基础镜像jdk安装配置失效解决

文章目录

1.问题

之前的好几篇文章中分享了在Linux(centOs上)和windows10上使用docker和docker Desktop环境构建java8的最小jre基础镜像,前几天我使用Docker Desktop环境重新构建了一个java8最小jre基础镜像,使用之前windows上使用的dockerfile构建是没有啥问题,但是本地项目引入该基础镜像之后,启动应用的容器,查看日志发现报了一个如下错误:

复制代码
/bin/sh: java: not found

这也是一个奇葩的问题,在Linux上使用之前Linx上构建的dockerflie构建之后,引入项目构建镜像启动容器验证java应用可以正常启动,并且请求接口java应用正常,不会挂掉,后面经过一番艰苦的排查之后,才发现是手动构建安装glibc相关的包在windows上构建失效了,最后导致jdk的二进制文件无法使用glibc来运行,所以报了这个错。

2.解决方法

Dockerfile中的基础镜像使用的是:alpine:3.12.0,后面我一想,居然是glibc失效了,那去docker仓库上找一个alpine包含了glibc的镜像,果然找到了一个:frolvlad/alpine-glibc,直接改为这个是最latest版本,替换之后,应用可以正常启动,但是访问应用接口只有,报了一个系统资源限制层面的错误:

复制代码
try "ulimit -c unlimited" before starting Java again

从而导致应用挂了,这个也是一个奇葩的问题,试了网上各种解决方法,最后都是无效的,后面又去docker仓库上找了一个带有glibc版本的alpine镜像:frolvlad/alpine-glibc:alpine-3.5_glibc-2.25,这个镜像版本跟之dockerflie中构建手动安装glibc的版本接近,后面拿过来一试,果然把上面那个问题解决了,容器运行访问应用接口,应用不会挂了。

需要准备如下文件:

Dockerfile_jre1.8.0_271构建文件内容如下:

dockerfile 复制代码
# using frolvlad/alpine-glibc:alpine-3.5_glibc-2.25
FROM frolvlad/alpine-glibc:alpine-3.5_glibc-2.25
# author
MAINTAINER BigFei<2514207794@qq.com>
# date zone 设置时间,避免相差8个小时
RUN echo "https://mirrors.aliyun.com/alpine/v3.6/main/" > /etc/apk/repositories
RUN echo "https://mirrors.aliyun.com/alpine/v3.6/community/" >> /etc/apk/repositories
# 更新系统的软件包
RUN ["apk","update"]
RUN ["apk","add","curl"]
RUN ["apk","add","wget"]
# 安装bash
RUN ["apk","add","bash"]
# 安装bash-doc
RUN ["apk","add","bash-doc"]
#安装bash自动命令补全
RUN ["apk","add","bash-completion"]
# 时区设置
RUN apk add --update --no-cache \
    tzdata && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
#安装glibc相关的包(下面是升级了glibc的版本,重试了还是不行,干脆glibc的都注释了,使用一个带有glibc的基础镜像不就行了)
# 清理临时文件要在 同一个RUN命令内进行, rm -rf .....,构建的时候每个RUN都会创建一个临时的容器,只有写在同一个RUN下才会在一个容器内执行
#RUN apk --no-cache add ca-certificates wget ; \
#    wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub ; \
#    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r1/glibc-bin-2.35-r1.apk ; \
#    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r1/glibc-i18n-2.35-r1.apk ; \
#    wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.35-r1/glibc-2.35-r1.apk ; \
#    apk add glibc-bin-2.35-r1.apk glibc-i18n-2.35-r1.apk glibc-2.35-r1.apk ;\
#    rm -rfv glibc-bin-2.35-r1.apk glibc-i18n-2.35-r1.apk glibc-2.35-r1.apk
# locale.md 见下面的内容
COPY ./locale.md /locale.md
RUN /bin/sh -c cat locale.md | xargs -i /usr/glibc-compat/bin/localedef -i {} -f UTF-8 {}.UTF-8
# A streamlined jre
ADD ./jre1.8.0_271.tar.gz /usr/local/java/jdk/
# set env
# 时区环境变量
ENV TZ Asia/Shanghai
# 语言环境变量
ENV LANG=en_US.UTF-8 \
    LANGUAGE=en_US.UTF-8
ENV JAVA_HOME /usr/local/java/jdk/
ENV PATH ${PATH}:${JAVA_HOME}/bin
#WORKDIR /opt

上面这个构建脚本经过我的亲测试是OK的,到此这个问题就解决了。

3.总结

Windwos环境和Linux环境系统差异会导致有的东西使用会存在兼容差异,jre最小镜像构建都可以构建成功,但是能不能用还有待验证,所以只有时间才能出真知,多踩踩坑,自然就轻车熟路了,java8以上的java版本构建最小镜像使用的是其他方法,后面有机会在分享,上面那个成功的脚本构建的镜像有390M,原因就是里面安装的包太多了,基础frolvlad/alpine-glibc:alpine-3.5_glibc-2.25才5-6M,不安装一些命令工具包,不方便使用,所以这个根据个人使用习惯去构建即可,本次分享到此结束,希望我的分享对你有所启发和帮助,请一键三连,么么么哒!

相关推荐
c++之路16 分钟前
C++20概述
java·开发语言·c++20
Championship.23.2420 分钟前
Linux Top 命令族深度解析与实战指南
java·linux·服务器·top·linux调试
橘子海全栈攻城狮35 分钟前
【最新源码】养老院系统管理A013
java·spring boot·后端·web安全·微信小程序
逻辑驱动的ken41 分钟前
Java高频面试考点18
java·开发语言·数据库·算法·面试·职场和发展·哈希算法
冷雨夜中漫步1 小时前
Claude Code源码分析——Claude Code Agent Loop 详细设计文档
java·开发语言·人工智能·ai
直奔標竿1 小时前
Java开发者AI转型第二十六课!Spring AI 个人知识库实战(五)——联网搜索增强实战
java·开发语言·人工智能·spring boot·后端·spring
木雷坞2 小时前
K8s GPU 推理服务 ImagePullBackOff 排查与预热
云原生·容器·kubernetes·gpu算力
one_love_zfl2 小时前
java面试-微服务组件篇
java·微服务·面试
一只大袋鼠2 小时前
Java进阶:CGLIB动态代理解析
java·开发语言
环流_2 小时前
HTTP 协议的基本格式
java·网络协议·http