docker jdk基础镜像精简(x86和arm架构)踩坑 第二弹

Posted @吕树

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker jdk基础镜像精简(x86和arm架构)踩坑 第二弹相关的知识,希望对你有一定的参考价值。

        通过上一篇 docker jdk基础镜像精简(带jps命令)第一弹的打包研究,用于x86的架构是没有问题的,但是由于公司的架构既有x86,又有arm,因此需要打两个架构的包;以下为我的打包过程遇到的几个问题(包含试错过程),如不想看可直接跳到结尾获取jdk镜像。

问题一:打arm架构的包,而我手头上外网只有x86的环境服务器?

解决方案:如何在x86架构下进行ARM镜像的构建与运行 和 [用友技术中台]使用x86服务器编译ARM容器镜像的解决方案-云社区-华为云博文中所诉利用QEMU这个开源的仿真模拟器,执行以下命令即可正常运行arm架构的镜像构建:

docker run --rm --privileged multiarch/qemu-user-static --reset --persistent yes

问题二:基础镜像是apline,需要安装依赖glibc库(因为jdk运行是需要glibc库的,而apline镜像不包含这个依赖库),在网上找了一翻关于arm的glibc库,试了一些依赖包,打完镜像后,基本都是缺胳膊少腿,无法执行jps的命令,怎么办?

解决方案:通过在官网上查找发现,已经有包含glibc依赖库的最小基础镜像了,因此通过官网hub.docker.com搜索alpine-glibc,出现很多版本,选择支持x86和arm的版本

试了几个即提供x86又提供arm版本的镜像,以下为试过的不可用版本及最终确定的可用版本

ng:
starudream/alpine-glibc        latest          (缺少locale文件及中文字符集)
cyphernode/alpine-glibc-base   v3.12.4_2.31-0  (有locale文件,但缺少中文字符集)
guisea/alpine-glibc            2.33            (Could not open '/lib/ld-linux-aarch64.so.1': No such file or directory)

ok:
tedli/alpine-glibc:3.14.0

问题三:我在x86架构服务器下怎么拉取到arm的镜像?

解决方案:参考了 docker x86平台 拉取 arm版镜像 博文,我选择了文中的第二种方式拉取:

#通过镜像的sha256值
x86
docker pull tedli/alpine-glibc:3.14.0@sha256:38f06462814329c5ad84d3f9e484e63019582664c7e1358f39defe1ef04162d2
arm
docker pull tedli/alpine-glibc:3.14.0@sha256:c69fba833fc8be8b5bdea60e9ef375b9a870970fdafc21540949d2083c714053

通过解决了以上三个问题之后,就可以顺利打jdk最小镜像了。

Dockerfile文件

# using alpine-glibc instead of alpine  is mainly because JDK relies on glibc
#分x86的基础镜像和arm的基础镜像
#尝试过其他很多apline-glibc的镜像缺胳膊少腿的,不好用
#这个基础镜像自带了ps netstat ip iostat top等命令,且包含了中文字符集C.UTF-8,中文不乱码,这是目前找到经过对比后非常棒的一个镜像
#以下两种架构镜像需要按架构拉取再进行编译镜像
#x86
#docker pull tedli/alpine-glibc:3.14.0@sha256:38f06462814329c5ad84d3f9e484e63019582664c7e1358f39defe1ef04162d2
#arm
#docker pull tedli/alpine-glibc:3.14.0@sha256:c69fba833fc8be8b5bdea60e9ef375b9a870970fdafc21540949d2083c714053
FROM tedli/alpine-glibc:3.14.0

LABEL maintainer="xieja"
LABEL time="2021-12-21 15:13:00"

# set timezone
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && \\
    echo $TZ > /etc/timezone
# A streamlined jre
ADD jre8-arm.tar.gz /usr/java/jdk/
ADD testChineseDisplay.sh /
# set env
ENV JAVA_HOME /usr/java/jdk
ENV PATH $PATH:$JAVA_HOME/bin

注意:

1、jre包的区别:

jre8-arm.tar.gz 等于jre-8u311-linux-x64.tar.gz删除无用文件后加上jdk-8u311-linux-aarch64.tar.gz中的jps及tools.jar,

jre8.tar.gz 等于 jre-8u311-linux-x64.tar.gz删除无用文件后加上jdk-8u311-linux-x64.tar.gz中的jps及tools.jar

打x86和arm的jdk镜像时导入的jre包要注意区分jre8.tar.gz和jre8-arm.tar.gz;

2、tedli/alpine-glibc:3.14.0的x86和arm都是同一个tag:

如果在同一个x86架构服务器下,需要区分引用,不然有可能打错镜像不可用,可以先打x86的jdk包,打完后,删除tedli/alpine-glibc:3.14.0镜像,通过镜像的sha256值拉取arm版本的镜像,再重新打jdk镜像包,这时打的就是arm版本的了;

以上为打包全过程,打出来的jdk镜像很小,x86的150M多,arm的140M多,内含基础命令ps、netstat、top、ip、jps、java等,支持中文日志打印(打镜像需要配置LANG=C.utf8)。

以下为打好的镜像(x86、arm),可自行获取,如果对你有帮助的话帮忙点的赞,谢谢啦,加班码完字,准备回家了。

百度网盘 请输入提取码:mitn

银河麒麟 arm架构 ubuntu docker制作jdk镜像

接上文:https://www.cnblogs.com/erlou96/p/13847912.html

银河麒麟操作系统, arm架构 服务器制作 ubuntu ssh的docker镜像,接下来制作jdk的docker镜像

 


 

一: 基础环境准备

准备基础环境:

  • docker ssh镜像(上文已做好)
  • open-jdk1.8(arm版)

 

二: 编写Dockerfile文件

新建目录:

mkdir -p /opt/docker-file/ubuntu-ssh-jdk

将下载好的openjdk 拷贝到该目录

cp -r /usr/lib/jvm/java-8-openjdk-arm64 /opt/docker-file/ubuntu-ssh-jdk

#重命名
mv /opt/docker-file/ubuntu-ssh-jdk/java-8-openjdk-arm64 /opt/docker-file/ubuntu-ssh-jdk/jdk

#将jdk制作tar包
tar -czvf jdk.tar jdk/

编写Dockerfile文件

#新建Dockerfile文件
touch Dockerfile

Dockerfile文件内容如下:

# 选择一个已有的os镜像作为基础  
FROM ubuntu-ssh-root:latest

# 镜像的作者  
MAINTAINER hanzhe

# ADD命令 将jdk打包文件上传到镜像的/usr/java ,会自动解压
ADD jdk.tar /usr/java/
# 配置java环境变量
ENV JAVA_HOME /usr/java/jdk
ENV PATH $JAVA_HOME/bin:$PATH

 

 

 

三: 构建docker image

构建命令:

docker build -t="ubuntu-ssh-jdk:v1" .

 

四:查看docker 镜像

docker images

 

 

五:验证

运行容器:

docker run -it -d --name test5 ubuntu-ssh-jdk:v1

进入容器:

docker exec -it 容器id /bin/bash

测试jdk:

java

 

基于ssh的docker容器制作jdk容器完成!!

 

以上是关于docker jdk基础镜像精简(x86和arm架构)踩坑 第二弹的主要内容,如果未能解决你的问题,请参考以下文章

ARM64架构下,OpenJDK的官方Docker镜像为何没有8版本?

银河麒麟 arm架构 ubuntu docker制作jdk镜像

docker镜像能跨平台运行吗?(可以跨平台,但是镜像架构必须与操作系统底层架构相同)(x86架构arm架构)

使用buildx在x86机器上面编译arm64架构的Docker镜像

使用 docker buildx 构建多 CPU 架构镜像

在x86的Docker中构建TVM的ARM环境