【问题标题】:Installing Java in Docker image在 Docker 映像中安装 Java
【发布时间】:2015-07-03 00:11:37
【问题描述】:

这是我第一次尝试创建 Docker 映像,希望有人能帮助我。我的 Dockerfile 大致是这样的:

FROM mybaseimage:0.1
MAINTAINER ...

ENV JAVA_HOME /usr/lib/jvm/java-7-openjdk-amd64
RUN sed 's/main$/main universe/' -i /etc/apt/sources.list

ENV DEBIAN_FRONTEND noninteractive

RUN apt-get update

RUN apt-get install -y openjdk-7-jre && apt-get clean &&\
             mkdir temp_dir  &&   cd temp_dir && \
             ${JAVA_HOME}/bin/jar -xvf somejar.jar  &&\
             cd ..
ENTRYPOINT ["somescript.sh"]

基本上我只是安装 Java,所以我可以扩展一个 jar 文件。当我运行我的 makefile 时,我收到以下错误:

/bin/sh: 1: /usr/lib/jvm/java-7-openjdk-amd64: 权限被拒绝

我一直在尝试遵循以下示例: https://registry.hub.docker.com/u/barnybug/openjdk-7-jre/dockerfile/

编辑:评论中的每个请求都是我的makefile:

DOCKER_REGISTRY=registry.mycompany.com
DOCKER_IMAGE=appimage-myapp
DOCKER_TAG=3.0

SUDO=

ARCHIVE_NAME=$(DOCKER_IMAGE):$(DOCKER_TAG)
  REPO_ARCHIVE_NAME=$(DOCKER_REGISTRY)/$(ARCHIVE_NAME)
  BASE_IMAGE_ARCHIVE=$(DOCKER_IMAGE)_$(DOCKER_TAG).tar.gz

all: $(BASE_IMAGE_ARCHIVE)

.PHONY: docker_image

docker_image: Dockerfile
    $(SUDO) docker build -t $(ARCHIVE_NAME) .

$(BASE_IMAGE_ARCHIVE): docker_image
  $(SUDO) docker tag -f $(ARCHIVE_NAME) $(REPO_ARCHIVE_NAME)
  $(SUDO) docker push $(REPO_ARCHIVE_NAME)
  $(SUDO) docker save $(ARCHIVE_NAME) | gzip -c > $@
  $(SUDO) docker rmi $(REPO_ARCHIVE_NAME)

我和它一起运行

make docker_image SUDO=sudo

【问题讨论】:

  • 你最好实际发布你的makefile。

标签: dockerfile


【解决方案1】:

我能够通过以下步骤安装 OpenJDK 8(取自 here)。我的 Dockerfile 继承自 phusion/baseimage-docker,它基于 Ubuntu 16.04 LTS。

# Install OpenJDK-8
RUN apt-get update && \
    apt-get install -y openjdk-8-jdk && \
    apt-get install -y ant && \
    apt-get clean;
    
# Fix certificate issues
RUN apt-get update && \
    apt-get install ca-certificates-java && \
    apt-get clean && \
    update-ca-certificates -f;

# Setup JAVA_HOME -- useful for docker commandline
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

要改为安装 OpenJDK 7,您可能需要预先添加

add-apt-repository ppa:openjdk-r/ppa

这样第一步就变成了

# Install OpenJDK-7
RUN add-apt-repository ppa:openjdk-r/ppa && \
    apt-get update && \
    apt-get install -y openjdk-7-jdk && \
    apt-get install -y ant && \
    apt-get clean;

我希望这会有所帮助。

【讨论】:

  • 它适用于openJDK8,但它不适用于openJDK11,我该如何安装openJDK11?
  • 它说 openjdk-7-jdk 不可用.. 我可以将哪个用于 JDK 7.. 我使用 base 作为 Ubuntu-20.04
  • E: 找不到包 openjdk-8-jdk
  • 有什么办法可以安装特定版本的java比如8u312-b07.?apt-get install -y openjdk-8-jdk
【解决方案2】:

我能够在使用 Ubuntu 18.04 的映像上安装 Java-11。我也只需要一个应用程序。 (Apache Tika 的 Python 包装器。)

FROM python:3.8.2-buster
COPY . /usr/src/app

# Install OpenJDK-11
RUN apt-get update && \
    apt-get install -y openjdk-11-jre-headless && \
    apt-get clean;

# Install PYTHON requirements
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# START WEBAPP SERVICE
CMD [ "python", "/usr/src/app/main.py" ]

希望对您有所帮助。

【讨论】:

  • 这对我不起作用,我得到“[91mE: Unable to locate package openjdk-11-jdk-headless [0mThe command '/bin/sh -c apt-get update && apt-get安装 -y openjdk-11-jdk-headless && apt-get clean;'返回一个非零代码:100"
  • 我收到以下错误。 “包'openjdk-8-jdk'没有安装候选者”我是docker新手,我不确定这个Dockerfile是否必须放在我的debian容器本身或我的Windows上。请提供任何帮助。
【解决方案3】:

FWIW,这是带有 OpenJDK 11 的 Node 16 基础映像:

FROM node:16
RUN apt-get update && \
    apt-get install -y openjdk-11-jdk ca-certificates-java && \
    apt-get clean && \
    update-ca-certificates -f
ENV JAVA_HOME /usr/lib/jvm/java-11-openjdk-amd64/
RUN export JAVA_HOME
CMD ["java", "-version"]

您可以通过构建镜像并运行容器来检查JDK安装:

docker build -t java11 . && docker run java11

应该产生以下输出:

openjdk version "11.0.13" 2021-10-19
OpenJDK Runtime Environment (build 11.0.13+8-post-Debian-1deb10u1)
OpenJDK 64-Bit Server VM (build 11.0.13+8-post-Debian-1deb10u1, mixed mode, sharing)

【讨论】:

    【解决方案4】:

    我最近遇到了这个问题。试图将 python 作为基础图像。但这个概念可以应用于任何其他流程。

    解决了几个障碍后,以下是最终的工作解决方案:

    FROM python:3.6.13
    ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
    WORKDIR /app
    COPY requirements.txt ./
    RUN apt update -y && apt-get install -y software-properties-common && \
        apt-add-repository 'deb http://security.debian.org/debian-security stretch/updates main' && apt update -y && \
        apt-get install -y openjdk-8-jdk-headless && \
        pip install --no-cache-dir -r requirements.txt && \
        export JAVA_HOME && \
        apt-get clean
    
    • 我们需要software-properties-common 来获取apt-add-repository
    • openjdk-8-jdk - 我们需要为此添加源代码。
    • deb http://security.debian.org/debian-security stretch/updates main 是正确的来源。我们不要指向未知的 ppa 来源
    • openjdk-8-jdk-headless - 发现它最适合基于 docker 的使用。

    【讨论】:

      【解决方案5】:

      java 已经有一个官方 repo,它使用 Open JDK。
      它非常容易使用。看看这个repo,它演示了非常基本的hello world program
      Dockerfile:

      FROM java:7
      COPY src /home/root/java/src
      WORKDIR /home/root/java
      RUN mkdir bin
      RUN javac -d bin src/HelloWorld.java
      ENTRYPOINT ["java", "-cp", "bin", "HelloWorld"]
      

      HelloWorld.java 文件:

      public class HelloWorld{
          public static void main(String[] args){
              System.out.println("Hello World!!!");
          }
      }
      

      【讨论】:

      • 我知道这个 repo,但我不能从那个 repo 继承——AFAIK Docker 只允许单一继承,我有另一个我需要从...继承的图像...mybaseimage
      • 这实际上并没有回答问题。这不是如何在 docker 中安装 java,而是如何使用 java base-image。
      猜你喜欢
      • 1970-01-01
      • 2021-12-09
      • 2019-03-23
      • 2022-11-18
      • 2020-10-20
      • 2021-04-02
      • 2018-05-31
      • 2018-01-30
      • 1970-01-01
      相关资源
      最近更新 更多