Docker Desktop 構建java8基礎鏡像jdk安裝配置失效解決
文章目錄
- 1.問題
- 2.解決方法
- 3.總結
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構建文件內容如下:
# 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,不安裝一些命令工具包,不方便使用,所以這個根據個人使用習慣去構建即可,本次分享到此結束,希望我的分享對你有所啟發和幫助,請一鍵三連,么么么噠!