java - 如何在 Docker 容器中安装/添加 jdk 7

标签 java python docker java-7

我在我的 Ubuntu 14.04 机器上创建了一个以 Python 为基础的 docker 镜像。我使用的 Docker 版本是 1.12.3。图像中使用的 Python 基础操作系统是 Debian。我的 docker 镜像中还需要 JAVA 7 (JDK 7)。里面有很少的Python脚本,也很少有需要JDK的脚本。

我能够在我的镜像中安装 JDK 7,但是从过去几天开始它停止工作了。 oracle-jdk-7 包不再可用是抛出错误。然后我尝试从 Dockerhub 获取 JDK 7 Dockerfile 内容并将这些行添加到我的 dockerfile 中。它工作了几次,然后开始抛出空间不足的错误。

但空间不是问题,因为 '/var' 只占用了 29%。以下是我的 Dockerfile 内容。

FROM python:2.7

ENV http_proxy http://http.proxy.abc.com:8000
ENV https_proxy http://http.proxy.abc.com:8000

RUN \
  apt-get update && \
  apt-get install -y openjdk-7-jdk && \
  rm -rf /var/lib/apt/lists/*

ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64

RUN pip install datetime && \
pip install pandas && \
pip install xlrd && \
pip install email && \
pip install Jinja2 && \
pip install bokeh==0.12.4

而且我还尝试了以下 jdk 7:

RUN    echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee /etc/apt/sources.list.d/webupd8team-java.list && \
       echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu precise main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list && \
       apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys EEA14886 && \
       apt-get update -qq && \
       echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \
       apt-get install oracle-java7-installer libxext-dev libxrender-dev libxtst-dev -y --no-install-recommends && \
       apt-get clean autoclean && \
       apt-get autoremove --yes && \
       rm -rf /var/lib/{apt,dpkg,cache,log}/ && \
      rm -rf /var/cache/oracle-jdk7-installer

这会引发下载失败并出现 404 错误并且未下载 Oracle JDK 7 的错误。直到几天前,这一切都很好。

这个我也试过了。

RUN \
  apt-get update && \
  apt-get install -y openjdk-7-jdk && \
  rm -rf /var/lib/apt/lists/*

这会引发空间已满的错误。我看到 '/var' 只占用了 29%。

这个也试过了。

RUN apt-get update && \
    apt-get upgrade -y && \
    apt-get install -y  software-properties-common && \
    add-apt-repository ppa:webupd8team/java -y && \
    apt-get update && \
    echo oracle-java7-installer shared/accepted-oracle-license-v1-1 select true | /usr/bin/debconf-set-selections && \
    apt-get install -y oracle-java8-installer && \
    apt-get clean

这会引发一些包丢失的错误。

请帮助我在我的 docker 镜像中获取 jdk 7。任何 JDK 类型都可以。 Oracle JDK 或开放式 jdk。

提前致谢。

最佳答案

您的环境包含代理定义

ENV http_proxy http://http.proxy.abc.com:8000
ENV https_proxy http://http.proxy.abc.com:8000

这样一来,所有到外部的流量都被路由到一个不存在的位置。删除这些行,docker 将能够检索 apt 资源。

除此之外,我将在此处为您提供完整的 dockerfile:

FROM python:2.7-wheezy

RUN pip install datetime && \
pip install pandas && \
pip install xlrd && \
pip install email && \
pip install Jinja2 && \
pip install bokeh==0.12.4


# add webupd8 repository
RUN \
    echo "===> add webupd8 repository..."  && \
    echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list  && \
    echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list  && \
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886  && \
    apt-get update  && \
    \
    \
    echo "===> install Java"  && \
    echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections  && \
    echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections  && \
    DEBIAN_FRONTEND=noninteractive  apt-get install -y --force-yes oracle-java8-installer oracle-java8-set-default  && \
    \
    \
    echo "===> clean up..."  && \
    rm -rf /var/cache/oracle-jdk8-installer  && \
    apt-get clean  && \
    rm -rf /var/lib/apt/lists/*

构建它:

 $ docker build -t t .

构建后的结果如下:

 $ docker run t java -version
java version "1.8.0_131"
Java(TM) SE Runtime Environment (build 1.8.0_131-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.131-b11, mixed mode)
 $ docker run t python -V
Python 2.7.13

更新:如果您想使用 oracle jdk7,只需通过以下方式在 dockerfile 中交换安装 jdk 的代码。另请注意,我更愿意在不同的 docker 容器中保留两个不同的 jdk。最好从不同的图像引用所需的 Java 版本,只需在构建内容后命名您的构建,例如:docker build -t py27jdk7

# add webupd8 repository
RUN \
    echo "===> add webupd8 repository..."  && \
    echo "deb http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee /etc/apt/sources.list.d/webupd8team-java.list  && \
    echo "deb-src http://ppa.launchpad.net/webupd8team/java/ubuntu trusty main" | tee -a /etc/apt/sources.list.d/webupd8team-java.list  && \
    apt-key adv --keyserver keyserver.ubuntu.com --recv-keys EEA14886  && \
    apt-get update  && \
    \
    \
    echo "===> install Java"  && \
    echo debconf shared/accepted-oracle-license-v1-1 select true | debconf-set-selections  && \
    echo debconf shared/accepted-oracle-license-v1-1 seen true | debconf-set-selections  && \
    DEBIAN_FRONTEND=noninteractive  apt-get install -y --force-yes oracle-java7-installer oracle-java7-set-default  && \
    \
    \
    echo "===> clean up..."  && \
    rm -rf /var/cache/oracle-jdk7-installer  && \
    apt-get clean  && \
    rm -rf /var/lib/apt/lists/*

Dockerfile 部分取自 here .

关于java - 如何在 Docker 容器中安装/添加 jdk 7,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44260323/

相关文章:

java - JTextPane 缩进

java - 如果文件不断更改,我是否必须创建 fileinputstream 的新实例?

java - jOOQ转换器在写入记录时隐式设置一个值

python - 将Python float 传递给C函数时,舍入模式不一致

python - 如何添加路径以便python可以找到程序?

java - Spring调度线程未访问数据库

php - 用于大量导入脚本的 Ruby 或 Python?

python - Docker 组合多个容器

macos - 容器内的 Docker 套接字权限

docker - rabbitmq-server - 与非 root 用户分离被阻塞