如何在Docker Container中安装/添加jdk 7

时间:2017-05-30 10:56:28

标签: 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

这会引发错误,导致缺少一些包。

请帮我在我的码头图像中获取jdk 7。任何JDK类型都可以。 Oracle JDK或打开jdk。

提前致谢。

3 个答案:

答案 0 :(得分:7)

您的环境包含代理定义

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容器中保留两个不同的jdks。从不同的图像引用所需的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

答案 1 :(得分:0)

您的磁盘空间确实已满,您可以使用df -kh命令检查或者有足够的磁盘空间,但是在inode之外,请运行df -ih进行确认(检查 ifree < / strong>或 iused )。

答案 2 :(得分:0)

这很可能是因为apt-get update完成的图层被缓存,并且变老了。

因此,告诉docker再次运行apt-get update并丢弃缓存的缓存。只需将--no-cache添加到docker build命令:

docker build --no-cache ....

或者,如果您使用的是docker-compose

docker-compose build --no-cache ...