首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将AdoptOpenJDK添加到Docker镜像中?

如何将AdoptOpenJDK添加到Docker镜像中?
EN

Stack Overflow用户
提问于 2019-11-30 11:41:46
回答 1查看 4K关注 0票数 3

我已经创建了一个通用的docker构建文件,其中包括kubectl和Helm等实用程序,但现在我想将adoptopenjdk与Maven一起添加到映像中,但是当我测试它时,Java会因为核心转储而崩溃。

下面是Dockerfile:

代码语言:javascript
复制
# docker-build-test-image

FROM    docker:stable-git

ENV     KUBERNETES_VERSION 1.11.10
ENV     HELM_VERSION 2.14.0
ENV     JDK_FILE=OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz
ENV     JDK_DIR=/opt/jdk-11.0.4+11
ENV     LANG=C.UTF-8
ENV     MAVEN_FILE apache-maven-3.3.9-bin.tar.gz

RUN     apk update && \
        apk add --no-cache curl && \
        apk add --no-cache bash && \
        apk add --no-cache jq && \
        apk add --no-cache gettext && \
        apk add --no-cache wget

RUN     apk add -U openssl curl tar gzip bash ca-certificates git && \
        curl -L -o /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
        curl -L -O https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.28-r0/glibc-2.28-r0.apk && \
        apk add glibc-2.28-r0.apk && \
        rm glibc-2.28-r0.apk

RUN     curl "https://kubernetes-helm.storage.googleapis.com/helm-v${HELM_VERSION}-linux-amd64.tar.gz" | tar zx && \
        mv linux-amd64/helm /usr/bin/ && \
        mv linux-amd64/tiller /usr/bin/ && \
        helm version --client && \
        tiller -version

RUN     curl -L -o /usr/bin/kubectl "https://storage.googleapis.com/kubernetes-release/release/v${KUBERNETES_VERSION}/bin/linux/amd64/kubectl" && \
        chmod +x /usr/bin/kubectl && \
        kubectl version --client

# https://github.com/frol/docker-alpine-glibc/blob/master/Dockerfile
# Here we install GNU libc (aka glibc) and set C.UTF-8 locale as default.

RUN ALPINE_GLIBC_BASE_URL="https://github.com/sgerrand/alpine-pkg-glibc/releases/download" && \
    ALPINE_GLIBC_PACKAGE_VERSION="2.28-r0" && \
    ALPINE_GLIBC_BASE_PACKAGE_FILENAME="glibc-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    ALPINE_GLIBC_BIN_PACKAGE_FILENAME="glibc-bin-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    ALPINE_GLIBC_I18N_PACKAGE_FILENAME="glibc-i18n-$ALPINE_GLIBC_PACKAGE_VERSION.apk" && \
    apk add --no-cache --virtual=.build-dependencies wget ca-certificates && \
    echo \
        "-----BEGIN PUBLIC KEY-----\
        MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEApZ2u1KJKUu/fW4A25y9m\
        y70AGEa/J3Wi5ibNVGNn1gT1r0VfgeWd0pUybS4UmcHdiNzxJPgoWQhV2SSW1JYu\
        tOqKZF5QSN6X937PTUpNBjUvLtTQ1ve1fp39uf/lEXPpFpOPL88LKnDBgbh7wkCp\
        m2KzLVGChf83MS0ShL6G9EQIAUxLm99VpgRjwqTQ/KfzGtpke1wqws4au0Ab4qPY\
        KXvMLSPLUp7cfulWvhmZSegr5AdhNw5KNizPqCJT8ZrGvgHypXyiFvvAH5YRtSsc\
        Zvo9GI2e2MaZyo9/lvb+LbLEJZKEQckqRj4P26gmASrZEPStwc+yqy1ShHLA0j6m\
        1QIDAQAB\
        -----END PUBLIC KEY-----" | sed 's/   */\n/g' > "/etc/apk/keys/sgerrand.rsa.pub" && \
    wget \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BASE_URL/$ALPINE_GLIBC_PACKAGE_VERSION/$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
    apk add --no-cache \
        "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME" && \
    \
    rm "/etc/apk/keys/sgerrand.rsa.pub" && \
    /usr/glibc-compat/bin/localedef --force --inputfile POSIX --charmap UTF-8 "$LANG" || true && \
    echo "export LANG=$LANG" > /etc/profile.d/locale.sh && \
    \
    apk del glibc-i18n && \
    \
    rm "/root/.wget-hsts" && \
    apk del .build-dependencies && \
    rm \
        "$ALPINE_GLIBC_BASE_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_BIN_PACKAGE_FILENAME" \
        "$ALPINE_GLIBC_I18N_PACKAGE_FILENAME"

WORKDIR /tmp
RUN     chmod 755 /opt
COPY    $JDK_FILE /tmp/
RUN     tar -zvxf /tmp/$JDK_FILE -C /opt/ \
        && rm /tmp/$JDK_FILE
ENV     JAVA_HOME $JDK_DIR
ENV     PATH "$PATH:$JDK_DIR/bin"

RUN     wget --no-cookies --no-check-certificate "https://archive.apache.org/dist/maven/maven-3/3.3.9/binaries/$MAVEN_FILE"
RUN     pwd
RUN     ls -ltr
RUN     tar -zvxf $MAVEN_FILE  -C /opt/
RUN     rm $MAVEN_FILE
ENV     PATH "$PATH:/opt/apache-maven-3.3.9/bin"

COPY    ./settings.xml /root/.m2/

JDK_FILE "OpenJDK11U-jdk_x64_linux_hotspot_11.0.4_11.tar.gz“直接从https://adoptopenjdk.net/releases.html?variant=openjdk11&jvmVariant=hotspot下载。

一个非常简单的Java测试文件:

代码语言:javascript
复制
class HelloWorld 
{ 
    public static void main(String args[]) 
    { 
        System.out.println("Hello, World"); 
    } 
}

我正在通过GitLab管道构建它:

代码语言:javascript
复制
image: ${BUILD_URL}/tools/build/docker-build-test-image/add-jdk:20191129.33

stages:
  - build

build:
  stage: build
  script:
    - java -version
    - javac HelloWorld.java
    - java HelloWorld

下面是输出:

代码语言:javascript
复制
$ java -version
openjdk version "11.0.4" 2019-07-16
OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.4+11)
OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.4+11, mixed mode)
#
# A fatal error has been detected by the Java Runtime Environment:
#
#  [thread 20 also had an error]SIGSEGV
 (0xb) at pc=0x00007f0c0251bba1, pid=18, tid=28
#
# JRE version: OpenJDK Runtime Environment (11.0.4+11) (build 11.0.4+11)
# Java VM: OpenJDK 64-Bit Server VM (11.0.4+11, mixed mode, tiered, compressed oops, serial gc, linux-amd64)
# Problematic frame:
# C  [libc.so.6+0x117ba1]
#
# Core dump will be written. Default location: Core dumps may be processed with "/usr/libexec/abrt-hook-ccpp %s %c %p %u %g %t e %P %I %h" (or dumping to /builds/d4e/playground/revills/java_test/core.18)
#
# An error report file with more information is saved as:
# /builds/d4e/playground/revills/java_test/hs_err_pid18.log
[thread 19 also had an error]
#
# If you would like to submit a bug report, please visit:
#   https://github.com/AdoptOpenJDK/openjdk-build/issues
#
/bin/bash: line 111:    18 Aborted                 (core dumped) java -version

你能告诉我我做错了什么吗?

干杯,史蒂夫

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-30 22:06:44

如果你构建在基本的高山之上,你可以添加open-jdk和maven。它可能看起来像这样:

代码语言:javascript
复制
from alpine:3.10

run apk --no-cache add openjdk11 --repository=http://dl-cdn.alpinelinux.org/alpine/edge/community
run apk add bash vim curl wget jq docker git tar unzip bash-completion ca-certificates
run cd /opt && curl -sSl http://mirror.vorboss.net/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz | tar -xz

env PATH "$PATH:/opt/apache-maven-3.6.3/bin"
entrypoint ["/bin/bash"]

这将使用java 11和最新的maven设置一个高山图像(在撰写本文时)。通常,我们会使用一个run命令来最小化图像中的层数,但我将把这种优化留给您的想象力。

我已经添加了一行代码,显示如何以及在哪里安装其他工具,如Docker、bash、vim、curl等。其中一些工具用于安装maven (tar解压缩),而另一些工具仅用于装饰。您只需要使用curltarunzip来回答这个问题,但是当您正在构建一个devbox时,我想我应该添加一些用于演示。

当你决定在这样的项目中使用哪个基础镜像时,最好是从基础操作系统开始,比如apline:3,而不是一些随机的镜像,它恰好安装了你需要的东西(在你的例子中是git)。像OO一样对待它--您继承了git镜像,因此您也是一个git镜像。在你的例子中,你不是一个真正的git镜像,你是一把瑞士军刀,你不知道另一个选择的底层操作系统到底是什么(如果你使用:latest作为标签,你不知道它将来会变成什么)。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59113002

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档