写点什么

制作 Docker 镜像,用来编译 OpenJDK11 源码

  • 2021 年 11 月 11 日
  • 本文字数:1692 字

    阅读完需:约 6 分钟

编写 Dockerfile

Dockerfile 内容如下,主要是安装必要的应用,另外关键的操作都有详细的注释,就不多说了:


#Docker image of source for OpenJDK

VERSION 0.0.1

Author: bolingcavalry

#基础镜像使用 ubuntu:16.04


FROM ubuntu:16.04


#作者


MAINTAINER BolingCavalry zq2599@gmail.com


#定义 boot jdk 文件名


ENV BOOT_JDK_FILE_NAME jdk-10_linux-x64_bin_ri


#定义 boot jdk 安装目录


ENV BOOT_JDK_PATH /usr/lib/jvm


#定义 boot jdk 解压后的包名


ENV BOOT_JDK_PACKAGE_NAME jdk-10


#boot jdk 的完全路径


ENV BOOT_JDK_HOME BOOT_JDK_PACKAGE_NAME


#boot jdk 相关的环境变量


ENV JAVA_HOME $BOOT_JDK_HOME


ENV JRE_HOME $BOOT_JDK_HOME/jre


ENV CLASSPATH .:JRE_HOME/lib


ENV PATH=PATH


#创建文件夹用于安装 boot jdk


RUN mkdir $BOOT_JDK_PATH


#将分割好的 boot jdk 安装文件逐个复制到镜像中,分多步完成,这样下载过程中出现问题时,不至于全部重新开始下载


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


COPY ./BOOT_JDK_PATH/


#还原成完整的文件,再解压开,将 boot JDK 配置信息写入环境变量,创建 jre 目录,把 lib 放进去


RUN cat BOOT_JDK_FILE_NAME-* > BOOT_JDK_FILE_NAME.tar.gz \


&& tar -zxvf BOOT_JDK_FILE_NAME.tar.gz -C $BOOT_JDK_PATH \


&& rm BOOT_JDK_FILE_NAME.tar.gz \


&& rm BOOT_JDK_FILE_NAME-* \


&& mkdir $BOOT_JDK_HOME/jre \


&& cp -r BOOT_JDK_HOME/jre/


#备份旧的源


RUN mv /etc/apt/sources.list /etc/apt/sources.list.backup


#复制新的源


COPY ./sources.list /etc/apt/


#apt 更新


RUN apt-get update \


&& apt-get install -y file autoconf zip libx11-dev libxext-dev libxrender-dev libxtst-dev libxt-dev libcups2-dev libfontconfig1-dev libasound2-dev


#命令行文件复制到工作目录


COPY ./cmd.sh /


#赋予可执行权限


RUN chmod a+x /cmd.sh


#启动执行


#CMD ["/bin/bash", "/cmd.sh"]


ENTRYPOINT ["/cmd.sh"]


看到这里您一定会有疑问:这么多行 COPY 命令,为什么不用 BOOT_JDK_FILE_NAME-*,这样岂不是一行命令就够了?


您可以在镜像 build 成功后,用 docker history 命令看看文件的 layer 数量,用多个 COPY 命令逐个执行,每个命令都对应一个小的 layer,这样用户下载镜像时就是在下载多个小文件了;

cmd.sh 文件

cmd.sh 的内容如下,可见当容器启动后,先完成 configure,再执行 make 命令进行编译:


#!/bin/bas


【一线大厂Java面试题解析+后端开发学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


h


#修改所属人和所属群组


echo "start chown and chgrp"


chown -R root /src/jdk11 && chgrp -R root /src/jdk11


cd /src/jdk11


#配置


echo "start configure"


bash /src/jdk11/configure


#开始编译,如果有入参,就作为 make 的参数


echo "start make"


if [ $# -gt 0 ]; then


echo "make param is "$1


make $1


else


make


fi


echo "Compile successful!"

source.list

这是构建镜像时,更新 Ubuntu 的时候用到的源,您可以自行从网上搜索,或者用我的 git 上的;

构建镜像

准备好上述材料后,整个文件夹应该是如下内容:



评论

发布
暂无评论
制作Docker镜像,用来编译OpenJDK11源码