Dockerfile中使用alpine镜像时,apk找不到Java 8。

7

我想要减小我的Docker镜像大小,于是换成了基于Alpine的镜像。结果出现了bash找不到apt的问题。原来,我需要使用apk代替apt。然而,似乎无法找到我所需的Java版本。以下是我的Dockerfile:

#Use alpine golang
FROM golang:alpine

#Get the code from local code commit repo
WORKDIR /go/src/xxx
COPY . /go/src/xxx

#Install Java and cleanup after in the same layer
RUN apk update && apk add openjdk-8-jre-headless && rm -rf /var/lib/apt/lists/*

#Install dependencies recursively and remove the third_party directory after it has been used for compiling.
RUN go get ./... && go run setup.go && RUN rm -rf third_party
#More commands...



 ---> 32a6b6b5f196 
Step 4/8 : RUN apk update && apk add openjdk-8-jre-headless && rm -rf /var/lib/apt/lists/* 
 ---> Running in bc48930e48be 
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz 
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz 
v3.9.4-4-gd5dd5c1cd0 [http://dl-cdn.alpinelinux.org/alpine/v3.9/main] 
v3.9.4-5-gcfdf5452f1 [http://dl-cdn.alpinelinux.org/alpine/v3.9/community] 
OK: 9766 distinct packages available 
  openjdk-8-jre-headless (missing): 
·[91mERROR: unsatisfiable constraints: 
·[0m    required by: world[openjdk-8-jre-headless] 
The command '/bin/sh -c apk update && apk add openjdk-8-jre-headless && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 1

我也尝试过

RUN apk update && apk add -t jessie-backports openjdk-8-jre-headless ca-certificates-java && rm -rf /var/lib/apt/lists/*

根据https://unix.stackexchange.com/questions/342403/openjdk-8-jre-headless-depends-ca-certificates-java-but-it-is-not-going-to-be的说法,但那也失败了,不确定是否是-t标志的问题:

Step 4/7 : RUN apk update && apk add -t jessie-backports openjdk-8-jre-headless ca-certificates-java && rm -rf /var/lib/apt/lists/* 
 ---> Running in 1e2ef22e7c16 
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/main/x86_64/APKINDEX.tar.gz 
fetch http://dl-cdn.alpinelinux.org/alpine/v3.9/community/x86_64/APKINDEX.tar.gz 
v3.9.4-4-gd5dd5c1cd0 [http://dl-cdn.alpinelinux.org/alpine/v3.9/main] 
v3.9.4-5-gcfdf5452f1 [http://dl-cdn.alpinelinux.org/alpine/v3.9/community] 
OK: 9766 distinct packages available 
·[91mERROR: unsatisfiable constraints: 
·[0m  openjdk-8-jre-headless (missing): 
    required by: jessie-backports-0[openjdk-8-jre-headless] 
  ca-certificates-java (missing): 
    required by: jessie-backports-0[ca-certificates-java] 
The command '/bin/sh -c apk update && apk add -t jessie-backports openjdk-8-jre-headless ca-certificates-java && rm -rf /var/lib/apt/lists/*' returned a non-zero code: 3 
3个回答

8

Alpine使用完全不同的软件包仓库,与Debian或Ubuntu不同。在那里,openjdk-8-jre-headless包不存在。您可以在这里检查并找到适合您需求的正确软件包。


7

如果你使用的是Alpine镜像,则使用以下命令添加Java8:

RUN apk add openjdk8-jre

3
你可以检查官方alpine OpenJDK镜像如何下载Java并遵循相同的步骤。
请查看Dockerfile,简单来说,你可以在你的Dockerfile中添加以下代码。
# add a simple script that can auto-detect the appropriate JAVA_HOME value
# based on whether the JDK or only the JRE is installed
RUN { \
        echo '#!/bin/sh'; \
        echo 'set -e'; \
        echo; \
        echo 'dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"'; \
    } > /usr/local/bin/docker-java-home \
    && chmod +x /usr/local/bin/docker-java-home
ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk
ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin

ENV JAVA_VERSION 8u212
ENV JAVA_ALPINE_VERSION 8.212.04-r0

RUN set -x \
    && apk add --no-cache \
        openjdk8="$JAVA_ALPINE_VERSION" \
    && [ "$JAVA_HOME" = "$(docker-java-home)" ]

我希望这能有所帮助。


10
这甚至有点过度 - apk add --no-cache openjdk8 就足够了。8.212.04-r0 是当前最新版本。 - valiano
@valiano 我总是更喜欢在构建时明确我的依赖版本,特别是当我安装它们时。 - ashishmohite
1
这是一个好的实践。但值得注意的是,Alpine 不会保留旧的软件包版本,因此除非其他版本在不同的存储库中明确指定,否则您无法指定除最新版本以外的任何版本。目前,在 Alpine 存储库 3.6、3.7、3.8、3.9 和 edge 中唯一可用的 openjdk8 版本是 8.212.04-r0,因此不能指定其他版本,一旦更新了 openjdk8 软件包,docker 构建将会中断。 - valiano
哦!我不知道这个 我猜官方的 Dockerfile 需要一个拉取请求 :D - ashishmohite

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接