在Docker镜像中安装java

Yan*_* K. 14 dockerfile

这是我第一次尝试创建一个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"]
Run Code Online (Sandbox Code Playgroud)

基本上我只是安装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)
Run Code Online (Sandbox Code Playgroud)

与我一起运行

make docker_image SUDO=sudo
Run Code Online (Sandbox Code Playgroud)

lay*_*lom 28

我能够OpenJDK-8通过以下步骤安装(从这里获取).我的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
Run Code Online (Sandbox Code Playgroud)

要安装OpenJDK-7,您可能需要预先安装

add-apt-repository ppa:openjdk-r/ppa
Run Code Online (Sandbox Code Playgroud)

这样第一步就变成了

# 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;
Run Code Online (Sandbox Code Playgroud)

我希望这有帮助.

  • E: 无法找到软件包 openjdk-8-jdk (2认同)

小智 10

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"]
Run Code Online (Sandbox Code Playgroud)

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

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"]
Run Code Online (Sandbox Code Playgroud)

应该产生以下输出:

docker build -t java11 . && docker run java11
Run Code Online (Sandbox Code Playgroud)


Chr*_*tag 9

我能够使用 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" ]
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

  • 这对我不起作用,我得到“[91mE:无法找到软件包 openjdk-11-jdk-headless [0m命令 '/bin/sh -c apt-get update && apt-get install -y openjdk-11-jdk -无头&&易于清洁;' 返回非零代码:100” (5认同)

Sab*_*bin -6

java已经有一个官方存储库,它使用 Open JDK。
使用起来非常方便。看一下这个repo,它演示了非常基本的hello world 程序
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"]
Run Code Online (Sandbox Code Playgroud)

HelloWorld.java 文件:

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

  • 我知道这个存储库,但我无法从该存储库继承——据我所知,Docker 只允许单一继承,而我有另一个图像需要从... mybaseimage 继承 (15认同)
  • 这实际上并不能回答问题。这不是如何在 docker 中安装 java,而是如何使用 java 基础镜像。 (3认同)