用带glibc的alpine镜像制作 自定义版本的oracle jdk和tomcat

简介: 我只能说, 以下这个dockerfile总结了很久, 当然,目前算是个半成品, 但对我极具参考价值!!! 注释里才是技术亮点。


我只能说,

以下这个dockerfile总结了很久,

当然,目前算是个半成品,

但对我极具参考价值!!!

注释里才是技术亮点。



# base image

# alpine的openjdk可以直接运行,但oracle jdk却需要glibc。残念。
From harbor.example.com/base/baseos/alpine-glibc:3.7-glibc2.27

# MAINTAINER
MAINTAINER XXX



#相将以下ENV合成一行,减少层数,但无论用不用等号,加斜杠,都没成功。又残念。  
ENV     JAVA_HOME=/usr/local/jdk1.8.0_73 
ENV 	CLASSPATH=$JAVA_HOME/bin 
ENV 	TOMCAT_VERSION=tomcat-8.0.14 
ENV 	CATALINA_HOME=/usr/local/${TOMCAT_VERSION} 
ENV 	PATH=.:${JAVA_HOME}/bin:${CATALINA_HOME}/bin:$PATH


RUN  mkdir -p /xxx/temp/ \
	# 统一tomcat的日志和软件包及配置目录。
        && mkdir -p /xxx/webconfigs/ \
        && mkdir -p /xxx/webapps/ \
        && mkdir -p /xxx/weblogs/ \
        && adduser x1 -D -S\
        && adduser x2 -D -S\
        && adduser x3 -D -S\
        # 加指定gid和uid的用户,主要是内核不支持user namespace,就行将uid和gid和宿主机一致。
        && addgroup -g 1234 -S x4 \
        && adduser  -u 5678 -D -S x4 -G x4 \
        && chown -R x4.x4 /xxx/ /xxx/ \
        && chmod 755 -R /xxx/ /xxx/ \
        # 想在alpine里su,要得这样,alpine基于busybox的。
	&& chmod 4755 /bin/busybox \
	# 这样可以更改root密码。至于万一得已登陆docker,这样行,k8s的dashboard也行的。
	&& echo -e "xxxxxx\nxxxxxx" | passwd root \
	# 清空瘦身jdk大小,可以COPY到docker以后进行,当然也可以在外面瘦身jdk再COPY进docker。
        # && rm -rf /usr/local/jdk1.8.0_73/*src.zip \
        #   /usr/local/jdk1.8.0_73/lib/missioncontrol \
        #   /usr/local/jdk1.8.0_73/lib/visualvm \
        #   /usr/local/jdk1.8.0_73/lib/*javafx* \
        #   /usr/local/jdk1.8.0_73/jre/lib/plugin.jar \
        #   /usr/local/jdk1.8.0_73/jre/lib/ext/jfxrt.jar \
        #   /usr/local/jdk1.8.0_73/jre/bin/javaws \
        #   /usr/local/jdk1.8.0_73/jre/lib/javaws.jar \
        #   /usr/local/jdk1.8.0_73/jre/lib/desktop \
        #   /usr/local/jdk1.8.0_73/jre/plugin \
        #   /usr/local/jdk1.8.0_73/jre/lib/deploy* \
        #   /usr/local/jdk1.8.0_73/jre/lib/*javafx* \
        #   /usr/local/jdk1.8.0_73/jre/lib/*jfx* \
        #   /usr/local/jdk1.8.0_73/jre/lib/amd64/libdecora_sse.so \
        #   /usr/local/jdk1.8.0_73/jre/lib/amd64/libprism_*.so \
        #   /usr/local/jdk1.8.0_73/jre/lib/amd64/libfxplugins.so \
        #   /usr/local/jdk1.8.0_73/jre/lib/amd64/libglass.so \
        #   /usr/local/jdk1.8.0_73/jre/lib/amd64/libgstreamer-lite.so \
        #   /usr/local/jdk1.8.0_73/jre/lib/amd64/libjavafx*.so \
        #   /usr/local/jdk1.8.0_73/jre/lib/amd64/libjfx*.so \
         #   /tmp/* /var/cache/apk/* \
         && echo "finished!!!!"



# 尴尬的是,如果内核不够新,这里想以非root访问,那么,USER x4是最后起作用,
# CP过去的总是root的权限,而chown和chmod都会将docker的images增大150m以上。
# 要是docker的软件版本能新点,COPY命令支持chown参数,就棒棒的了。
COPY tomcat-8.0.14 /home/docker/tomcat-8.0.14
COPY jdk1.8.0_73 /home/docker/jdk1.8.0_73


#如何提前在本地,作了这几个文修的,就不用CP了,还能减少几层
# COPY ["./server.xml", "/usr/local/apache-tomcat-8.0.14/conf/server.xml"]
# COPY ["./logging.properties", "/usr/local/apache-tomcat-8.0.14/conf/logging.properties"]
# COPY ["./setenv.sh", "/usr/local/apache-tomcat-8.0.14/bin/setenv.sh"]

WORKDIR ${CATALINA_HOME}

# 要是内核新点,能支持user namespace,就可以将root里的用户映射为宿主机的普通用户了。
# 而不用费尽心机的将docker的用户id,组id与宿主机里的uid,gid进行匹配。
USER x4

EXPOSE 8080

CMD ["catalina.sh", "run"]


目录
相关文章
|
2月前
|
Java 开发工具
开发工具系列 之 同一个电脑上安装多个版本的JDK
这篇文章介绍了如何在一台电脑上安装和配置多个版本的JDK,包括从官网下载所需JDK、安装过程、配置环境变量以及如何查看和切换当前使用的JDK版本,并提到了如果IDEA和JDK版本不兼容时的解决方法。
开发工具系列 之 同一个电脑上安装多个版本的JDK
|
2月前
|
Java API
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
JDK8到JDK25版本升级的新特性问题之使用Collectors.teeing()来计算一个列表中学生的平均分和总分如何操作
|
2月前
|
Java API Apache
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
JDK8到JDK24版本升级的新特性问题之在Java中,HttpURLConnection有什么局限性,如何解决
|
2月前
|
Oracle Java 关系型数据库
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
JDK8到JDK29版本升级的新特性问题之未来JDK的升级是否会成为必然趋势,如何理解
|
2月前
|
Oracle 安全 Java
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
JDK8到JDK28版本升级的新特性问题之在Java 15及以后的版本中,密封类和密封接口是怎么工作的
|
2月前
|
开发者 C# UED
WPF多窗口应用程序开发秘籍:掌握窗口创建、通信与管理技巧,轻松实现高效多窗口协作!
【8月更文挑战第31天】在WPF应用开发中,多窗口设计能显著提升用户体验与工作效率。本文详述了创建新窗口的多种方法,包括直接实例化`Window`类、利用`Application.Current.MainWindow`及自定义方法。针对窗口间通信,介绍了`Messenger`类、`DataContext`共享及`Application`类的应用。此外,还探讨了布局控件与窗口管理技术,如`StackPanel`与`DockPanel`的使用,并提供了示例代码展示如何结合`Messenger`类实现窗口间的消息传递。总结了多窗口应用的设计要点,为开发者提供了实用指南。
96 0
|
2月前
|
Java 开发者
Jenv多版本JDK管理大揭秘:动态切换、轻松配置,一文让你彻底解锁!
【8月更文挑战第25天】Jenv是一款强大的Java版本管理工具,它使开发者能够在不同的项目中灵活使用多个JDK版本。通过环境变量管理和命令行操作实现版本切换。安装简便,配置快捷。只需几条命令即可添加、查看及切换JDK版本。示例展示了如何在项目中运用不同JDK版本编译与运行程序,极大提升了开发效率和灵活性。
114 0
|
2月前
|
Java
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
JDK序列化原理问题之在JDK序列化中不同JDK版本字段不一致的情况如何解决
|
2月前
|
算法 Java iOS开发
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化
JDK8到JDK27版本升级的新特性问题之JDK 17中G1在资源占用方面有何变化
|
2月前
|
XML JSON Java
JDK8到JDK26版本升级的新特性问题之在JDK 13中,字符串文本块改进字符串嵌入是如何实现的
JDK8到JDK26版本升级的新特性问题之在JDK 13中,字符串文本块改进字符串嵌入是如何实现的
下一篇
无影云桌面