我的第一个 Dockerfile: jdk8 + maven3.6

本贴最后更新于 2026 天前,其中的信息可能已经时移世改

前言

最近在学习 Docker,在学习 Dockerfile 的时候,感觉有些吃力,所以就停了下来,一边参考大神们的代码,一边改,一边写,这个过程中沉淀了一些东西,这里记录下,也算做个分享。

学习资料

Docker 的书网上好多,我阅读了好几本,发现好多都是抄袭 《第一本Docker书 修订版》,这个在 github 上有,这里给一个链接吧:《第一本 Docker 书 修订版》,如果你是初学者,建议看这本书。

同时再推荐个掘金上的小册:开发者必备的 Docker 实践指南

当然 DockerHub 上的各个镜像也是不错的,其中有很多都带有 Dockerfile,可以根据他们进行阅读。

第一个脚本

说明

这个脚本是我为了使用最新的 JDK8_201 版本和 maven3.6.1 构建的。

如果你的 JDK8 是商用,最新的版本都得是 202,否则会被 Oracle 认为你侵权。

在构建构成中,我也发现了一些问题,主要如下:

  1. 通过 wget 下载 oracle jdk 很恶心,官方只给你最新的版本的下载,如果老版本,你必须要登录。
  2. 通过 wget 下载的速度,真心慢,这个应该是国情吧...
  3. 为了处理上述问题,我是先下载到本地后,通过 COPY 引入的,这样的好处是构建镜像的速度快,缺点是没有直接利用远程下载来的方便。

准备工作

为了使用这个脚本,你需要先创建一个目录,比如是 dockerfile-helloworld,同时下载 3 个东西放在这个目录中。

  1. jdk-8u201-linux-x64.tar.gz ,下载地址:https://www.oracle.com/technetwork/java/javase/downloads/java-archive-javase8-2177648.html
  2. jce_policy-8.zip,下载地址:http://download.oracle.com/otn-pub/java/jce/8/jce_policy-8.zip
  3. apache-maven-3.6.1-bin.tar.gz,下载地址:http://archive.apache.org/dist/maven/maven-3/3.6.1/binaries/apache-maven-3.6.1-bin.tar.gz

编写脚本

FROM jeanblanchard/alpine-glibc
MAINTAINER "liuchunfu" <liuchunfu@outlook.com>

ENV M2_HOME=/usr/mvn
ENV JAVA_HOME=/usr/java
ENV PATH=${PATH}:${JAVA_HOME}/bin:${M2_HOME}/bin

# 因为Oracle的JDK不能下载,所以先下载在本地,什么都不带,默认应该是放在temp目录下下的
COPY jdk-8u201-linux-x64.tar.gz /temp/java.tar.gz
RUN  mkdir -p ${JAVA_HOME} && \ 
  tar -zxf /temp/java.tar.gz -C  /temp && \
  mv /temp/jdk1.8.0_201/*  ${JAVA_HOME}

# 处理jdk对于AES256不能加密的问题
COPY jce_policy-8.zip /temp/jce_policy-8.zip
RUN  unzip /temp/jce_policy-8.zip -d /temp && \
   mv /temp/UnlimitedJCEPolicyJDK8/*.jar ${JAVA_HOME}/jre/lib/security/

# 删除jdk目录下一些可能用不到的资源
RUN rm -rf ${JAVA_HOME}/*src.zip \
         ${JAVA_HOME}/lib/missioncontrol \
         ${JAVA_HOME}/lib/visualvm \
         ${JAVA_HOME}/lib/*javafx* \
         ${JAVA_HOME}/jre/lib/plugin.jar \
         ${JAVA_HOME}/jre/lib/ext/jfxrt.jar \
         ${JAVA_HOME}/jre/bin/javaws \
         ${JAVA_HOME}/jre/lib/javaws.jar \
         ${JAVA_HOME}/jre/lib/desktop \
         ${JAVA_HOME}/jre/plugin \
         ${JAVA_HOME}/jre/lib/deploy* \
         ${JAVA_HOME}/jre/lib/*javafx* \
         ${JAVA_HOME}/jre/lib/*jfx* \
         ${JAVA_HOME}/jre/lib/amd64/libdecora_sse.so \
         ${JAVA_HOME}/jre/lib/amd64/libprism_*.so \
         ${JAVA_HOME}/jre/lib/amd64/libfxplugins.so \
         ${JAVA_HOME}/jre/lib/amd64/libglass.so \
         ${JAVA_HOME}/jre/lib/amd64/libgstreamer-lite.so \
         ${JAVA_HOME}/jre/lib/amd64/libjavafx*.so \
         ${JAVA_HOME}/jre/lib/amd64/libjfx*.so

#处理Maven
COPY apache-maven-3.6.1-bin.tar.gz  /temp/maven.tar.gz 
RUN mkdir $M2_HOME && \
  tar -zxf /temp/maven.tar.gz -C /temp && \
  mv /temp/apache-maven-3.6.1/*  $M2_HOME

#直接把temp这个临时目录删除,减少镜像的地址
RUN rm -fr /temp

在上述脚本中使用了如下几个指令:

  • Run 这个网上解释很多,我觉的你可以想象为,你进入一个 linux 系统后,要部署 java 环境,你要通过终端输入哪些指令。
  • COPY 就是将资源放入镜像内,为什么要放入其中了,因为是为了使用他(这里我感觉貌似可以直接外部引用)

核心的其实就这 2 个指令,其他的都是 linux 的脚本。

慢慢发现了一个问题,我觉的编写 Dockerfile 不难,难得是 shell 脚本的编写啊...

结语

最后,我把这个东西开源了,放在了 github 上,地址:来点我啊来啊,今年第一次开源的小东西,好了周五 6 点 10 分了,下班~

  • Docker

    Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的操作系统上。容器完全使用沙箱机制,几乎没有性能开销,可以很容易地在机器和数据中心中运行。

    490 引用 • 916 回帖 • 2 关注
  • 运维

    互联网运维工作,以服务为中心,以稳定、安全、高效为三个基本点,确保公司的互联网业务能够 7×24 小时为用户提供高质量的服务。

    148 引用 • 257 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...
  • someone756

    给你点个小心心.💗💗 😄😄

  • szy0syz

    “MAINTAINER "liuchunfu" <liuchunfu@outlook.com>”

    官方不支持这样写了,可以用 LABEL 。

    2 回复
  • 你先要看下他的 docker 版本才对

  • 请教下 jce 是个啥

  • hkpqazwsxedc

    加油

  • 233333

    trollface 再加上 dockerhub 自动化监听 github 提交构建 ,跑 java 项目我都是直接 FROM maven:3-jdk-8-alpine

    1 操作
    233333 在 2019-04-22 10:22:29 更新了该回帖
  • tiangao

    推荐试一下 daocloud.io , 其他不说,镜像还是很快的

    1 回复
  • CodingOX

    谢谢告知,现在用的阿里云的加速器,速度很不错,daocloud 也用过,后面弃用了,阿里云的应该是官方加速,速度也是非常快!

  • CodingOX

    我也发现了再提示这个,初学者,我慢慢学习,谢谢提醒!

请输入回帖内容 ...