精华内容
下载资源
问答
  • 构建openjdk镜像 通过做一些实验,我发现手头提供JDK源代码来进行一些更改,使用它等等通常很有用。因此,我决定下载并编译该野兽。 显然,这花了我一些时间,尽管我最初的想法是,它应该和运行make命令一样简单:)...

    构建openjdk镜像

    通过做一些实验,我发现手头提供JDK源代码来进行一些更改,使用它等等通常很有用。因此,我决定下载并编译该野兽。 显然,这花了我一些时间,尽管我最初的想法是,它应该和运行make命令一样简单:)。 您可能会猜到,我发现这不是一项微不足道的任务,并且为了简化以后的生活,保留一些有关我所做工作的记录将非常有用。

    以下是我要做的步骤。 我认为计算机已经安装了Visual Studio 2010。 我觉得Express版本应该可以正常工作,但是我还没有尝试过。

    1. 安装cygwin。 确保已安装此处列出的所有软件包,其中一些默认情况下未安装。 以防万一,这是该表的副本,但建议与主数据源进行验证:
      二进制名称 类别 描述
      可执行文件 开发 Binutils GNU汇编器,链接器和二进制实用程序
      制作工具 开发 使 为CYGWIN构建的'make'实用程序的GNU版本。
      可执行文件 口译员 m4 传统Unix宏处理器的GNU实现
      脚本文件 实用程序 cpio 一个管理文件存档的程序
      gawk.exe 实用程序 awk 模式导向的扫描和处理语言
      文件 实用程序 文件 使用“魔术”数字确定文件类型
      压缩文件 封存 压缩 打包和压缩(存档)文件
      解压缩程序 封存 解压缩 提取ZIP档案中的压缩文件
      免费版 系统 ps 显示系统中的可用和已用内存量

      不要忘记将cygwin的'bin'文件夹添加到PATH中。

    2. 此处安装Mercurial并将“ hg”添加到PATH。
    3. 安装用于Windows 7和.NET Framework 4的Microsoft Windows SDK
    4. 安装DirectX SDK 。 JDK需要v9.0,但我很难找到它。 因此,我决定不打扰并安装最新的。 似乎工作正常。
    5. Bootstrap JDK是构建所必需的。 碰巧我使用了JDK6,但是假设任何> JDK6的版本都没有问题。
    6. 下载并安装Ant 。 我使用的是1.8.2版本。 将Ant添加到PATH。
    7. 结帐来源。 由于多种原因,它是最复杂的部分。 “ hg”并不是特别稳定,因此某些本应由我的脚本完成的事情是手动完成的。

      因此,要在命令行中开始运行此命令:

      hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u <some_folder>\openjdk7'

      这应该下载带有一些帮助脚本的根文件夹。

      然后在cygwin中转到刚刚创建的“ openjdk7”文件夹并运行“ get_source.sh”。 “ get_source.sh”可能失败或只是挂起(这正是我所发生的事情)。 如果是这样,则您可以尝试使用“ –pull”标志(元数据的拉协议)。 我不确定为什么,但这对我有所帮助。 不幸的是,脚本不是以非常友好的方式编写的,并且无法将任何“ hg”参数传递给源检索脚本。 因此,您需要转到“ make \ scripts \ hgforest.sh”并将“ –pull”添加到“ hg clone”的每次调用中。

      而且即使添加“ -pull”后仍然失败,嗯……只要放弃并手动运行以下命令:

      hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/corba corba
      hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/hotspot hotspot
      hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/jaxp jaxp
      hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/jaxws jaxws
      hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/jdk jdk
      hg clone --verbose --pull http://hg.openjdk.java.net/jdk7u/jdk7u/langtools langtools

      希望现在您有资源并且可以有所帮助:)

    8. Build需要一些外部二进制文件和一个可在Windows下运行的'make.exe'版本。 cygwin附带的'make'并没有真正起作用,因为路径名中的驱动器字母存在一些问题。

      接下来是我们需要编译几个文件。 一种是“ make.exe”的固定版本。 另一个是FreeType库,只能作为源下载。

      如果您对编译所有这些东西不感兴趣,而只想轻松编译JDK,则建议从此处下载二进制文件(这是我的云端硬盘)。 将“ make.exe”解压缩到“ openjdk7 / bin”中。 请注意,该软件包中的“ make.exe”非常老,需要cygintl-3.dll,当前cygwin并未提供。 要修复此问题,只需复制cygintl-8.dll-> cygintl-3.dll。
      Freetype的lib和dll必须放在ALT_FREETYPE_LIB_PATH conf变量引用的文件夹中(请参阅步骤13)。 另外,仍然需要一些Freetype标头,并通过make通过ALT_FREETYPE_HEADERS_PATH变量进行定位(请参见步骤13)。 这意味着您还需要下载源代码。

      如果您不是在寻找简单的解决方案,而是想自己编译这些二进制文件,请按照以下说明进行操作:

      1. 这里下载make 3.82并将其解压缩。 找到“ config.h.W32”,并用“ HAVE_CYGWIN_SHELL”定义取消注释行。 在Visual Studio中打开make_msvc_net2003.sln解决方案,选择“发布”配置并进行构建。 在“发布”文件夹中,您将获得“ make_msvc.net2003.exe”,并将其重命名为“ make.exe”。
      2. 现在编译FreeType:
        1. 此处下载FreeType v.2.4.7的源代码。
        2. 将其解压缩到某个位置,然后在Visual Studio中打开“ \ builds \ win32 \ vc2010 \ freetype.sln”。
        3. 转到项目属性(在项目树中的项目上单击鼠标右键),然后在“配置属性/常规/配置类型”中选择“动态库(.ddl)”,然后将输出重命名为“ freetype”。
        4. 更新ftoption.h,添加以下两行:
          #定义FT_EXPORT(x)__declspec(dllexport)x
          #定义FT_BASE(x)__declspec(dllexport)x
        5. 进行构建,您将在'objs \ win32 \ vc2010'中获得dll和lib。
        6. 不要忘记为“ ALT_FREETYPE_LIB_PATH”和“ ALT_FREETYPE_HEADERS_PATH”变量分配适当的值(请参阅步骤13)。
    9. 我在javadoc生成方面遇到了一些问题,但由于OutOfMemory失败。 为了修复它,我不得不更改“ openjdk7 \ jdk \ make \ docs \ Makefile”。
      这段代码:
      ifeq ($(ARCH_DATA_MODEL),64)
        MAX_VM_MEMORY = 1024
      else ifeq ($(ARCH),universal)
        MAX_VM_MEMORY = 1024
      else
        MAX_VM_MEMORY = 512
      endif

      必须用以下内容替换:

      ifeq ($(ARCH_DATA_MODEL),64)
        MAX_VM_MEMORY = 1024
      else ifeq ($(ARCH),universal)
        MAX_VM_MEMORY = 1024
      else
        MAX_VM_MEMORY = 1024
      endif
    10. 将“ msvcr100.dll”复制到以下位置:
      cp /cygdrive/c/Program\ Files\ \(x86\)/Microsoft\ Visual\ Studio\ 10.0/Common7/Packages/Debugger/X64/msvcr100.dll ./drops/
    11. 确保cygwin的“ find.exe”在Windows之前的PATH中。 最简单的方法是将其复制到“ openjdk7 / bin”,然后在当前PATH的开头进行设置。
    12. 创建一个类似于以下文件的批处理文件。 不要忘记适当地更新路径:
      ALT_BOOTDIR=C:/Stuff/java_libs/jdk1.6.0_25
      ANT_HOME=C:/Stuff/java_libs/apache-ant-1.8.2
      JAVA_HOME=
      CLASSPATH=
      PATH=C:/Stuff/openjdk7/bin;%PATH%
      ALLOW_DOWNLOADS=true
      ALT_MSVCRNN_DLL_PATH=C:/Stuff/java_libs/openjdk7/drops
      
      C:\WINDOWS\system32\cmd.exe /E:ON /V:ON /K 'C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd' /Release /xp /x86
    13. 运行批处理文件。 现在,您已经完全配置了环境,可以开始构建了。 运行“ bash”,然后从shell执行“ make”:
      make ARCH_DATA_MODEL=32 ALT_OUTPUTDIR=C:/Users/Stas/Stuff/java_libs/openjdk7/output_32 ALT_FREETYPE_LIB_PATH=C:/Users/Stas/Stuff/java_libs/openjdk7/freetype-2.4.7/objs/win32/vc2010 ALT_FREETYPE_HEADERS_PATH=C:/Users/Stas/Stuff/java_libs/openjdk7/freetype-2.4.7/include ALT_BOOTDIR=C:/Users/Stas/Stuff/java_libs/jdk1.6.0_25 ALT_DROPS_DIR=c:/OpenJDK/ALT_DROPS_DIR ALT_DROPS_DIR=C:/Users/Stas/Stuff/java_libs/openjdk7/drops HOTSPOT_BUILD_JOBS=4 PARALLEL_COMPILE_JOBS=4 2>&1 | tee C:/Stuff/java_libs/openjdk7/output_32.log

      这将开始构建32位JDK。

    14. 喝咖啡,茶或您想要的任何东西,然后大约一个小时后,您应该会看到类似以下的内容:
      #-- Build times ----------
      Target all_product_build
      Start 2012-09-01 23:08:55
      End   2012-09-01 23:55:48
      00:02:35 corba
      00:06:46 hotspot
      00:00:30 jaxp
      00:00:51 jaxws
      00:35:30 jdk
      00:00:37 langtools
      00:46:53 TOTAL
      -------------------------

    参考:来自Stas博客博客的JCG合作伙伴 Stanislav Kobylansky在Windows上构建OpenJDK


    翻译自: https://www.javacodegeeks.com/2012/09/stass-blog-building-openjdk-on-windows.html

    构建openjdk镜像

    展开全文
  • 实战Docker镜像文件的制作过程,这个镜像用来下载OpenJDK11源码

    《极简,利用Docker仅两行命令就能下载和编译OpenJDK11》一文中,我们用以下命令实现了OpenJDK11源码的下载:

    docker run \
    --rm \
    -it \
    -v /usr/local/work/openjdksrc:/output \
    bolingcavalry/openjdksrc11:0.0.2
    

    今天我们就来看下Docker镜像bolingcavalry/openjdksrc11:0.0.2的制作过程,看看它做了哪些事情来简化下载过程;

    环境信息

    1. 操作系统:Ubuntu 16.04.5 LTS;
    2. Docker:18.06.1-ce;

    准备材料

    本次镜像用到了以下材料:

    1. Dockerfile:制作Docker镜像的脚本文件;
    2. cmd.sh:容器启动后执行的命令脚本;
    3. OpenJDK11源码压缩包(参考《Ubuntu环境下载OpenJDK11源码》);

    您可以选择直接从GitHub下载上述所有内容,地址和链接信息如下表所示:

    名称链接备注
    项目主页https://github.com/zq2599/openjdksrc11该项目在GitHub上的主页
    git仓库地址(https)https://github.com/zq2599/openjdksrc11.git该项目源码的仓库地址,https协议
    git仓库地址(ssh)git@github.com:zq2599/openjdksrc11.git该项目源码的仓库地址,ssh协议

    要注意的问题

    制作镜像前有两个问题先考虑好:

    1. 基础镜像尽量小,由于容器启动后要执行一些shell命令,所以选用仅含bash工具的bash:5.0-rc;
    2. OpenJDK11源码包不小(超过1G),因此做成的镜像也很大,用户下载镜像时,一旦网络问题下载失败,docker会自动重试,此时是重新下载,这意味着之前的下载都白做了,为了缓解这个问题,可以把整个源码压缩包分割成多个小文件,这样虽然整体大小不变,但是失败时重新下载的文件是很小的,在linux环境执行以下命令,将整个OpenJDK11源码压缩包分割成多个最大10兆的文件:
    split -b 10m jdk11.tar.gz jdk11-
    

    编写Dockerfile

    Dockerfile内容如下,可见大部分内容是复制文件的操作,其余部分已有详细的注释,就不多说了:

    # Docker image of source for OpenJDK
    # VERSION 0.0.2
    # Author: bolingcavalry
    
    #基础镜像使用bash:5.0-rc,特点是体积小
    FROM bash:5.0-rc
    
    #作者
    MAINTAINER BolingCavalry <zq2599@gmail.com>
    
    #定义源码存放目录
    ENV SRC_PATH /src
    
    #定义OpenJDK源码文件夹名称
    ENV OPENJDK_SRC_PACKAGE_NAME jdk11
    
    #创建目录
    RUN mkdir $SRC_PATH
    
    #把分割过的源码复制到工作目录,这么写可以保证每个文件layer都不大,这样下载镜像时如果中途失败,就不用重新下载一个巨大的layer
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-af $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-an $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-av $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bd $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bl $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bt $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cb $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cj $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cr $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cz $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dh $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dp $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dx $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ef $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ag $SRC_PATH/ 
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ao $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-aw $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-be $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bm $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bu $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cc $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ck $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cs $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-da $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-di $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dq $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dy $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-eg $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ah $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ap $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ax $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bf $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bn $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bv $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cd $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cl $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ct $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-db $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dj $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dr $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dz $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-eh $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-aa $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ai $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-aq $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ay $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bg $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bo $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bw $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ce $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cm $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cu $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dc $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dk $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ds $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ea $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ei $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ab $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-aj $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ar $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-az $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bh $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bp $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bx $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cf $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cn $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cv $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dd $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dl $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dt $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-eb $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ej $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ac $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ak $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-as $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ba $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bi $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bq $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-by $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cg $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-co $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cw $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-de $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dm $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-du $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ec $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ek $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ad $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-al $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-at $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bb $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bj $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-br $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bz $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ch $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cp $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cx $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-df $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dn $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dv $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ed $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-el $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ae $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-am $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-au $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bc $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bk $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-bs $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ca $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ci $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cq $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-cy $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dg $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-do $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-dw $SRC_PATH/
    COPY ./$OPENJDK_SRC_PACKAGE_NAME-ee $SRC_PATH/
    
    #命令行文件复制到工作目录
    COPY ./cmd.sh /
    
    RUN chmod a+x /cmd.sh
    
    CMD ["bash", "/cmd.sh"]
    

    看到这里您一定会有疑问:这么多行COPY命令,为什么不用OPENJDK_SRC_PACKAGE_NAME-*,这样岂不是一行命令就够了?
    您可以在镜像build成功后,用docker history命令看看文件的layer数量,用多个COPY命令逐个执行,每个命令都对应一个小的layer,这样用户下载镜像时就是在下载多个小文件了;

    cmd.sh文件

    cmd.sh的内容如下,可见当容器启动后,先将分割后的多个小文件通过cat命令恢复成完整的jdk11.tar.gz文件,再解压,然后删除jdk11.tar.gz文件:

    echo "start build gz file"
    cat $SRC_PATH/$OPENJDK_SRC_PACKAGE_NAME-* > /output/$OPENJDK_SRC_PACKAGE_NAME.tar.gz
    echo "gz file build success, start unzip"
    tar -zxvf /output/$OPENJDK_SRC_PACKAGE_NAME.tar.gz -C /output
    echo "unzip success, start remove gz file"
    rm /output/$OPENJDK_SRC_PACKAGE_NAME.tar.gz
    echo "download openjdk11 source successful!"
    

    构建镜像

    在Dockerfile文件所在目录执行以下命令即可构建好镜像文件:

    docker build -t bolingcavalry/openjdksrc11:0.0.2 .
    

    至此,镜像制作完毕,可以通过Docker来下载完整的OepnJDK11源码了,如果电脑空间紧张,docker run命令执行完毕后,记得用docker rmi bolingcavalry/openjdksrc11:0.0.2删除镜像;

    欢迎关注我的公众号:程序员欣宸

    在这里插入图片描述

    展开全文
  • 实战Docker镜像文件的制作过程,这个镜像用来编译OpenJDK11源码

    《极简,利用Docker仅两行命令就能下载和编译OpenJDK11》一文中,我们用以下命令实现了OpenJDK11源码的编译:

    docker run --rm \
    -it \
    -v /usr/local/work/openjdksrc:/src \
    bolingcavalry/buildopenjdk11:0.0.2
    

    今天我们就来看下Docker镜像bolingcavalry/buildopenjdk11:0.0.2的制作过程,看看它做了哪些事情来简化下载过程;

    参考文章

    如果您打算在真实Linxu环境下编译OpenJDK11源码,可以参照《Ubuntu环境编辑OpenJDK11源码》

    环境信息

    1. 操作系统:Ubuntu 16.04.5 LTS;
    2. Docker:18.06.1-ce;

    准备材料

    本次镜像用到了以下材料:

    1. Dockerfile:制作Docker镜像的脚本文件;
    2. cmd.sh:容器启动后执行的命令脚本;
    3. jdk10安装包,在编译OpenJDK11的时候,需要先装好jdk10作为bootjdk;
    4. source.list:linux源;

    您可以选择直接从GitHub下载上述所有内容,地址和链接信息如下表所示:

    名称链接备注
    项目主页https://github.com/zq2599/buildopenjdk11该项目在GitHub上的主页
    git仓库地址(https)https://github.com/zq2599/buildopenjdk11.git该项目源码的仓库地址,https协议
    git仓库地址(ssh)git@github.com:zq2599/buildopenjdk11.git该项目源码的仓库地址,ssh协议

    要注意的问题

    jdk10安装文件jdk-10_linux-x64_bin_ri.tar.gz有186兆,因此做成的镜像也很大,用户下载镜像时,一旦网络问题下载失败,docker会自动重试,此时是重新下载,这意味着之前的下载都白做了,为了缓解这个问题,可以把文件分割成多个小文件,这样虽然整体大小不变,但失败时重下载的文件是很小的,在linux环境执行以下命令,将文件分割成多个最大10兆的文件:

    split -b 10m jdk-10_linux-x64_bin_ri.tar.gz jdk-10_linux-x64_bin_ri-
    

    编写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_PATH/$BOOT_JDK_PACKAGE_NAME
    
    #boot jdk相关的环境变量
    ENV JAVA_HOME $BOOT_JDK_HOME
    ENV JRE_HOME $BOOT_JDK_HOME/jre
    ENV CLASSPATH .:$BOOT_JDK_HOME/lib:$JRE_HOME/lib
    ENV PATH=$BOOT_JDK_HOME/bin:$PATH
    
    #创建文件夹用于安装boot jdk
    RUN mkdir $BOOT_JDK_PATH
    
    #将分割好的boot jdk安装文件逐个复制到镜像中,分多步完成,这样下载过程中出现问题时,不至于全部重新开始下载
    COPY ./$BOOT_JDK_FILE_NAME-ac $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ag $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ak $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ao $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-as $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ad $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ah $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-al $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ap $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-aa $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ae $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ai $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-am $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-aq $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ab $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-af $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-aj $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-an $BOOT_JDK_PATH/
    COPY ./$BOOT_JDK_FILE_NAME-ar $BOOT_JDK_PATH/
    
    #还原成完整的文件,再解压开,将boot JDK配置信息写入环境变量,创建jre目录,把lib放进去
    RUN cat $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME-* > $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME.tar.gz \
    && tar -zxvf $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME.tar.gz -C $BOOT_JDK_PATH \
    && rm $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME.tar.gz \
    && rm $BOOT_JDK_PATH/$BOOT_JDK_FILE_NAME-* \
    && mkdir $BOOT_JDK_HOME/jre \
    && cp -r $BOOT_JDK_HOME/lib $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/bash
    #修改所属人和所属群组
    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上的;

    构建镜像

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

    在这里插入图片描述

    现在,在Dockerfile文件所在目录执行以下命令即可构建好镜像文件:

    docker build -t bolingcavalry/buildopenjdk11:0.0.2 .
    

    至此,镜像制作完毕,可以直接通过docker run命令来编译构建自己的OpenJDK了,相比在真实Linux环境编译,此方式更为简单方便;

    欢迎关注我的公众号:程序员欣宸

    在这里插入图片描述

    展开全文
  • Docker制作含字体库的OpenJdk镜像

    千次阅读 2020-08-21 11:43:58
    最近项目上测试环境,测试测一个导出模板的功能时,发现模板导出出来,于是我在本地试了一下... 现在提供下第二种方案:制作一个含字体库的openjdk镜像 调整Dockerfile文件如下: FROM openjdk:8-jdk-alpine RUN echo ...

    最近项目上测试环境,测试测一个导出模板的功能时,发现模板导出出来,于是我在本地试了一下,结果正常导出,同一份代码部署到测试怎么就不一样了呢,无奈只能查看服务器日志,发下如下错误:

    java.lang.IllegalArgumentException: The workbook already contains a sheet named

    结果百度了一下午,没有解决方案,偶然看到一个资源下载,说是Docker缺少字体库原因,我突然想到之前处理过一个问题,也是Docker部署项目,然后图形验证码不显示问题。
    在这里插入图片描述
    之前的解决方案是吧 Dockerfile中的From及基础镜像从 openjdk修改为Oracle Jdk。因为openjdk是不包含字体库的。
    在这里插入图片描述
    现在提供下第二种方案:制作一个含字体库的openjdk镜像

    调整Dockerfile文件如下:

    FROM openjdk:8-jdk-alpine
    RUN echo "http://mirrors.aliyun.com/alpine/v3.6/main" > /etc/apk/repositories \
        && echo "http://mirrors.aliyun.com/alpine/v3.6/community" >> /etc/apk/repositories \
        && apk update upgrade \
        && apk add --no-cache procps unzip curl bash tzdata \
        && apk add ttf-dejavu \
        && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && echo "Asia/Shanghai" > /etc/timezone
    

    打包镜像:

    docker build -t my-openjdk8 .
    

    如果你使用了镜像库,将打包的镜像推送上去即可

    docker login --username=admin --password=Harbor12345 ip
    docker push ip/library/my-openjdk8
    
    展开全文
  • 在搭建OpenJDK的过程中遇见了很多坑,很多没想到的事情,在这里一一总结,并且给大家一个参考。 Docker 进入Docker后,发现安装的Ubuntu啥都没有,于是利用install安装了如vim等一系列软件,有了最精简的环境。 获得...
  • 通过Dockerfile创建JDK8的CentOS镜像

    万次阅读 2017-11-21 16:21:25
    通过Dockerfile创建JDK8的CentOS镜像 [root@node4 ~]# mkdir jdk8_centos [root@node4 ~]# cd jdk8_centos/ 准备jdk安装包 [root@node4 jdk8_centos]# ls Dockerfile server-jre-8u152-linux-x64.tar.gz [root@node...
  • 在树莓派或者其他ARM架构的环境中(例如华为的泰山ARM服务器),能否在Docker环境下成功运行Java应用,Jdk镜像是首要面临的挑战
  • openjdk-alpine镜像字体问题 FROM openjdk:8-jdk-alpine RUN apk add --update ttf-dejavu fontconfig && rm -rf /var/cache/apk/* docker build -t swr....
  • 平时经常用到镜像,但基础镜像构建不怎么用,容易忘记,记个笔记,用于自己以后看。 Dockerfile FROM redis:5.0.7 ADD openjdk-8 /usr/local/openjdk-8 # Default to UTF-8 file.encoding ENV LANG C.UTF-8 ENV JAVA...
  • alpine Linux简介 ...注2:openjdk:8-jdk-alpine这个镜像就和我们自己创建的镜像是一样,只不过JDK瘦身过了,体积更小 大家可以自己下来,创建一个容器试一下 注3:最后制作完成后的镜像大小为400M左右
  • 2.3版本的SpringBoot,推荐了新的docker镜像构建方案,一起来实践吧
  • 这些JRE非常小,因为它们是为嵌入式系统制作的。 支持的标签和相应的Dockerfile链接 每个“紧凑的个人资料”都有一个标记的图像: 细节 这些是什么? tl; dr:Busybox + libc 64位+ libc 32位+嵌入式JRE =小型Java...
  • JDK8 基础镜像制作

    2020-10-23 14:53:13
    JDK8 基础镜像制作 准备工作 下载jdk:wget https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u265b01.tar.gz 拉取centos镜像:docker pull centos 编写...
  • ARM处理器环境下,想把Java应用运行在Docker环境,首先要找好基础镜像,如果您的Java应用是基于JDK8版本,就会面临找不到8版本JDK镜像的问题,本文就来解决此问题。
  • 准备好 Docker 环境(基于Centos 7,Docker version 19.03.12) 拉取一个 centos 7 作为基础镜像: ...容器中安装常用 linux 命令,安装JDK(参考:OPENJDK官网)并配置环境变量 打成新的镜像:docker commit -m ..
  • 制作 centos jdk1.8 镜像

    2019-12-14 12:56:17
    1.dockerfile # using alpine-glibc instead of alpine is mainly because JDK relies on glibc FROM centos # author MAINTAINER wcy # A streamlined jre ADD java1.8.tar.gz /usr/java/jdk/ ...
  • kubectl镜像制作

    2021-09-13 16:49:17
    done fi exec "$@" 步骤 1、创建文件夹mkdir -p /dockerfile/kubectl,将准备相关文件放入kubectl文件夹中 2、切换到kubectl文件夹内使用docker build 构建镜像 docker build --tag=kubectl:v1.19.7 . 3、测试镜像 ...
  • 制作jdk基础镜像

    千次阅读 2017-11-25 13:15:49
    这样创建的镜像文件尺寸会比较大,可以删掉一些不需要的文件。 创建镜像 docker build -f jdk8.dockerfile -t repo.cssweb.com:5000/chenhf/jdk8 . 查看镜像 docker images 上传镜像到...
  • alpine制作镜像

    2020-02-26 09:06:57
    alpine制作镜alpine Linux简介基于alpine制作JDK8镜像Alpine制作jre镜像Docker镜像上传至阿里云前期准备忘记密码可以点击菜单:“容器镜像服务”->“默认实例”-->“访问凭证”进行修改pull(拉)镜像 alpine ...
  • openjdk:8-jre镜像是基于debian系统的。默认时区是UTC。 下面两个方法都可以把时区改为Asia/Shanghai - 启动java应用时设置jvm参数 jvm参数 -Duser.timezone=Asia/ShangHai - 创建容器时设置debian的时区文件 ...
  • 1、编写dockerfile vi test-Dockerfile -- 基础镜像,根据远程...2、使用build命令制作镜像 docker build -t openjdk:test . -f test-Dockerfile 3、如果有需要push镜像 docker push openjdk:test 4、使用 docker ru
  • 使用Dockerfile制作ffmpeg镜像

    千次阅读 2020-09-16 14:25:18
    这段时间在研究使用ffmpeg处理音频和图片,需要跑在docker中,所以制作了个基础镜像,这里做个记录 Dockerfile FROM openjdk:8-jre-alpine MAINTAINER wadu <wadu@iflytek.com> RUN echo ...
  • 欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos为什么需要ARM架构下的OpenJDK8的Docker镜像?对现有的Java应用,之前一直运行在x86处理器环境下,编译和运行...
  • 使用docker制作一个zookeeper镜像

    千次阅读 2018-01-26 11:05:56
    修改镜像(由于centos没有ping工具包,在基础包上安装后,提交成一个版本)   docker run -it --network=shadownet --ip=172.18.0.12 centos:6.8 /bin/bash [root@e2bdf95d0658 /]# yum install iputils -y &...
  • 由于项目的Dockerfile中使用openjdk:8-jdk-alpine作为基础镜像部署服务,此镜像存在一定问题,例如时差8小时问题,或是由于字体问题导致导出excel文件内容为空等。 二、解决 1、解决字体问题 新建Dockerfile文件 ...
  • 制作基于Centos7的jdk1.8镜像FROM192.168.2.196/base/centos7:latest MAINTAINERwangxiaoke MAINTAINERwangke@zhaotai.ren WORKDIR/opt USERroot ADDjdk-8u131-linux-x64.tar.gz ENVJAVA_HOME=/opt/jdk1....

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,744
精华内容 697
关键字:

制作openjdk镜像