背景
Docker Hub 上有很多官方的 JDK 镜像,但是它们都不是基于 ubuntu 的,而是基于更小的 Linux 发行版,在使用一些命令行工具的之后老师报找不到,而且自己对 ubuntu 也更加熟悉。
Dockerfile
# 以ubuntu为基础镜像
FROM ubuntu:18.04# 指明该镜像的作者
MAINTAINER monkeybrain# 更新apt源
RUN sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list \&& sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list # 复制linux版本jdk压缩包到镜像内
COPY /jdk-8u381-linux-x64.tar.gz /usr/java/jdk-8u381-linux-x64.tar.gz
# 解压缩jdk到指定目录
RUN mkdir /usr/java/jdk
RUN tar -zxvf /usr/java/jdk-8u381-linux-x64.tar.gz -C /usr/java/jdk# 设置JAVA_HOME、CLASSPATH、PATH环境变量
ENV JAVA_HOME=/usr/java/jdk/jdk1.8.0_381
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATHRUN apt update
# 设置启动命令,打印jdk版本
CMD ["java", "-version"]
以此 Dockerfile 构建的镜像拥有国内的apt源,且安装了jdk8。
在构建此镜像的时候我遇到了一个问题,如果将 RUN apt update
的位置放在更新apt源的 RUN 之后,或报错,但是镜像构建成功,如下所示:
# 以ubuntu为基础镜像
FROM ubuntu:18.04# 指明该镜像的作者
MAINTAINER monkeybrain# 更新apt源
RUN sed -i s/archive.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list \&& sed -i s/security.ubuntu.com/mirrors.aliyun.com/g /etc/apt/sources.list
RUN apt update# 复制linux版本jdk压缩包到镜像内
COPY /jdk-8u381-linux-x64.tar.gz /usr/java/jdk-8u381-linux-x64.tar.gz
# 解压缩jdk到指定目录
RUN mkdir /usr/java/jdk
RUN tar -zxvf /usr/java/jdk-8u381-linux-x64.tar.gz -C /usr/java/jdk# 设置JAVA_HOME、CLASSPATH、PATH环境变量
ENV JAVA_HOME=/usr/java/jdk/jdk1.8.0_381
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV PATH=$JAVA_HOME/bin:$PATH# 设置启动命令,打印jdk版本
CMD ["java", "-version"]
这样构建出来的镜像要自己手动进入容器里面重新执行 apt update
,如果不执行可能会在执行 apt install
报找不到软件。如果有知道原因的可以在评论区解释一下。
参考:
https://juejin.cn/post/7195443401142042683
https://blog.csdn.net/eif88/article/details/123852897