以前曾经试过在VMware上安装linux,再在linux上编译openjdk8,但是每次都不顺利,例如linux环境,预装依赖软件,openjdk源码的选择等环境都会遇到问题,一旦失败再重新开始挺费时间的,现在用docker就省事多了,镜像和容器的创建和删除都比较简单干净,专心做好Dockerfile就行,下面我们一起来实践一下吧。
本次实战用到的所有文件,已经打包到github上,路径是:https://github.com/zq2599/centos7_build_openjdk8 ,欢迎您来使用(git clone git@github.com:zq2599/centos7_build_openjdk8.git)
本次编译实战的基本步骤如下:
编写的Dockerfile中要做的如下的事情:
安装依赖的软件;
把openjdk的源码复制到镜像中;
在编写Dockerfile之前要做三个重要的选择,如下:
linux:我选择了centos7,之前试过ubuntu16.04,但是在configure的时候提示"freetype"没有安装,我按照提示去装了,再次configure的时候继续提示"freetype"没有安装......(此问题现在还没解决,如果您解决过相同问题,请您告诉一下解决方法,谢谢了!)
openjdk源码,这次要编译的是openjdk8,源码的下载地址在这里
Bootstrap JDK:即编译时要用到的JDK,下载了openjdk的源码后,解压开可以看到“README-builds.html”这个文件,里面有对Bootstrap JDK的描述:
看得出,需要安装jdk7来编译openjdk8的源码;
OK,关键问题都已确认,即将开始Dockerfile制作,不过制作之前还有个小问题需要先想好:本次我打算把制作镜像所需的Dockerfile和依赖文件都放到github上去,这样做的好处有两个:
读者们从git上clone下来之后直接执行Docker build就能在本地构建镜像;
daocloud.io网站上支持通过执行github目录的方式在线构建镜像,后面我们会实践在daocloud.io上构建镜像并部署到腾讯云或者阿里云服务器上;
上传到github时,除了Dockerfile,还要上传的文件有两个:jdk1.7和openjdk8源码,都超过了100M,如下图:
这就麻烦了,github上传文件的时候,单个文件不能超过100M,否则push的时候会被服务器拒绝,解决这个问题有两个办法:
构建镜像的时候不要把这两个文件复制到镜像中了,改为在Dockerfile中通过执行wget命令将这两个文件分别下载到镜像中,openjdk的下载路径是,而jdk1.7的下载路径就难办了,oracle上下载历史版本的时候,是要做登录操作的,这个在Dockerfile中难以实现,找到了一个下载地址https://mirror.its.sfu.ca/mirror/CentOS-Third-Party/NSG/common/x86_64/jdk-7u80-linux-x64.rpm,但是下载速度很慢,最少一个小时以上了,所以wget这种方法看似简单,但下载文件耗时实在太长;
第二种方法比较简单易用,就是在mac或者linux上先用split命令将文件分割成多个,再上传到github上,在Dockerfile中有对应的命令将分割后的文件恢复成分割前的原文件,具体的分割命令如下:
split -b 50m jdk-7u71-linux-x64.rpm jdkrpm-这个命令是将jdk-7u71-linux-x64.rpm分割成不超过50m的多个文件,分割后的文件以jdkrpm-作为文件名的前缀,如下图:
opensdk的源码用如下命令分割:
split -b 50m openjdk-8-src-b132-03_mar_2014.zip openjdksrc-Dockerfile中,从分割文件恢复以上两个原文件的命令为:
cat jdkrpm-* > jdk-7u71-linux-x64.rpm cat openjdksrc-* > openjdk-8-src-b132-03_mar_2014.zip以上就是两种处理大文件的方法,本文用的是第二种,即先分割上传到git,在Dockerfile中将已分割文件恢复成原文件再使用。
好了,前期的准备工作已经做完了,现在可以编写Dockerfile文件了,整个文件中要做的事情列出如下:
安装依赖软件,例如libXtst-devel,libXt-devel等等,这些都是编译前的configure命令要检查的,检查不过无法进行编译;
把分割后的openjdk源码复制到镜像文件中,再合成,再解压;
安装jdk7,把分割后的安装文件复制到镜像中合成,然后安装;