【问题标题】:Dockerfile alpine image apk cannot find Java 8Dockerfile alpine image apk 找不到 Java 8
【发布时间】:2019-05-28 07:25:56
【问题描述】:

我想减少我的 docker 镜像并改用 alpine 基础镜像。这会导致 bash 找不到合适的问题。事实证明,我必须改用 apk 。但是,它似乎没有找到我需要的 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 

【问题讨论】:

    标签: docker alpine alpine-package-keeper


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      你可以查看官方的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)" ]
      

      希望对你有帮助

      【讨论】:

      • 这甚至有点矫枉过正——apk add --no-cache openjdk8 就足够了。 8.212.04-r0 是当前最新版本。
      • @valiano 我总是更喜欢明确我的依赖版本,尤其是当我在构建时安装它们时。
      • 这是个好习惯。但是值得注意的是,Alpine 上没有保留旧的包版本,因此除了最新版本之外,您不能指定任何内容(除非其他版本在不同的存储库中可用,并且明确指定)。目前,Alpine 存储库 3.6、3.7、3.8、3.9 和 edge 中唯一可用的 openjdk8 版本是 8.212.04-r0,因此无法指定其他版本,一旦更新 openjdk8 包,docker build 将中断。
      • 哦!我不知道这个我猜官方Dockerfile 需要一个拉请求然后:D
      【解决方案3】:

      如果您使用的是 Alpine 映像,请使用以下命令添加 java8

      RUN apk add openjdk8-jre
      

      【讨论】:

        猜你喜欢
        • 2017-03-08
        • 1970-01-01
        • 2018-08-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 2019-04-23
        • 2020-05-22
        相关资源
        最近更新 更多