乐趣区

关于云计算:制作JavaCV应用依赖的基础Docker镜像CentOS7JDK8OpenCV4

欢送拜访我的 GitHub

https://github.com/zq2599/blog_demos

内容:所有原创文章分类汇总及配套源码,波及 Java、Docker、Kubernetes、DevOPS 等;

本篇概览

  • 在《三分钟:极速体验 JAVA 版指标检测 (YOLO4)》一文中,咱们体验了 YOLO4 弱小的物体辨认能力,如下图:

  • 如果您已看过《三分钟:极速体验 JAVA 版指标检测 (YOLO4)》,甚至入手实际操作过,您应该会对背地的技术细节感兴趣,接下来就请随欣宸一起入手实战,从无到有将这个利用开发进去;

实战内容

  • 为了缩小环境和软件差别的影响,让程序的运行调试更简略,也为了让利用能够在容器环境运行,最终整个利用会被制作成 docker 镜像,所以咱们的指标被设定为上面三项:
  • 开发出 java 版的物体辨认利用
  • 将此利用制作成 docker 镜像
  • 在 docker 环境运行这个利用
  • 基于上述指标,咱们能够确定以下操作步骤:
  • 筹备好 docker 根底镜像
  • 开发 java 利用
  • 将 java 利用打包成 package 文件,集成到根底镜像中,失去最终的 java 利用镜像
  • 整个流程如下图所示:

  • 本篇的指标就是上述第一步:筹备好 docker 根底镜像

制作根底镜像

  • 如果您有过制作 java 利用镜像的经验,肯定会产生疑难:如下图红框所示,个别不都是把 OpenJDK 的官网镜像作为根底镜像吗?为啥要用一篇文章来讲根底镜像的事件?

  • 对于物体检测的利用来说,OpenJDK 的官网镜像是不够用的,因为用 java 实现检测须要一个关键技术:javacv,在 javacv 运行过程中须要用到 opencv 的一些本地库,因而须要在运行环境中装置 opencv
  • 如下图所示,一个利用自下而上由六局部形成,如果将底部的操作系统、JDK、OpenCV 做成根底镜像就不便多了,咱们开发利用的时候只有需关注下面三层即可,而下面三层不就是个一般的 maven 工程吗?

  • 至此,聪慧的您对接下来要做的事件应该很分明了:编写 Dockerfile 文件用来制作镜像,这个镜像中要有 CentOS7 + JDK1.8 + OpenCV4

分两步走

  • 我打算先做一个 CentOS7 + JDK8 的镜像,在此基础上再做一个集成了 OpenCV 的镜像,这样在一些不须要 OpenCV 的场景中,我还能独自应用 CentOS7 + JDK1.8 的镜像
  • 剖析实现,开始入手吧

CentOS7 + JDK8 的镜像

  • 之所以抉择 CentOS 作为操作系统,是因为平时工作中最罕用的就是它了
  • 纵观 OpenJDK 官网的各种镜像,并没有发现 CentOS 作为操作系统的,因而本人动手做一个吧,思路很简略:找到 OpenJDK 的 Dockerfile 文件,把它的根底镜像换成 CentOS7.6 即可
  • 以下是 Dockerfile 的所有内容,可见外围是依据不同的操作系统下载文件而后装置,逻辑简略清晰就不多说了:
FROM centos:7.6.1810

RUN set -eux; \
    yum install -y \
        gzip \
        tar \
        binutils \
        freetype fontconfig \
    ;

ENV JAVA_HOME /usr/java/openjdk-8
ENV PATH $JAVA_HOME/bin:$PATH

# Default to UTF-8 file.encoding
ENV LANG C.UTF-8

RUN set -eux; \
    \
    arch="$(objdump="$(command -v objdump)"&& objdump --file-headers"$objdump"| awk -F'[:,]+[[:space:]]+''$1 =="architecture"{print $2}')"; \
    case "$arch" in \
        'i386:x86-64') \
            downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_8u292b10.tar.gz'; \
            ;; \
        'aarch64') \
            downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_aarch64_linux_8u292b10.tar.gz'; \
            ;; \
        *) echo >&2 "error: unsupported architecture:'$arch'"; exit 1 ;; \
    esac; \
    \
    curl -fL -o openjdk.tgz "$downloadUrl"; \
    curl -fL -o openjdk.tgz.asc "$downloadUrl.sign"; \
    \
    export GNUPGHOME="$(mktemp -d)"; \
# pre-fetch Andrew Haley's (the OpenJDK 8 and 11 Updates OpenJDK project lead) key so we can verify that the OpenJDK key was signed by it
# (https://github.com/docker-library/openjdk/pull/322#discussion_r286839190)
# we pre-fetch this so that the signature it makes on the OpenJDK key can survive "import-clean" in gpg
    gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAC843EBD3EFDB98CC772FADA5CD6035332FA671; \
# TODO find a good link for users to verify this key is right (https://mail.openjdk.java.net/pipermail/jdk-updates-dev/2019-April/000951.html is one of the only mentions of it I can find); perhaps a note added to https://adoptopenjdk.net/upstream.html would make sense?
# no-self-sigs-only: https://salsa.debian.org/debian/gnupg2/commit/c93ca04a53569916308b369c8b218dad5ae8fe07
    gpg --batch --keyserver keyserver.ubuntu.com --keyserver-options no-self-sigs-only --recv-keys CA5F11C6CE22644D42C6AC4492EF8D39DC13168F; \
    gpg --batch --list-sigs --keyid-format 0xLONG CA5F11C6CE22644D42C6AC4492EF8D39DC13168F \
        | tee /dev/stderr \
        | grep '0xA5CD6035332FA671' \
        | grep 'Andrew Haley'; \
    gpg --batch --verify openjdk.tgz.asc openjdk.tgz; \
    rm -rf "$GNUPGHOME"; \
    \
    mkdir -p "$JAVA_HOME"; \
    tar --extract \
        --file openjdk.tgz \
        --directory "$JAVA_HOME" \
        --strip-components 1 \
        --no-same-owner \
    ; \
    rm openjdk.tgz*; \
    \
    rm -rf "$JAVA_HOME/jre/lib/security/cacerts"; \
# see "update-ca-trust" script which creates/maintains this cacerts bundle
    ln -sT /etc/pki/ca-trust/extracted/java/cacerts "$JAVA_HOME/jre/lib/security/cacerts"; \
    \
# https://github.com/oracle/docker-images/blob/a56e0d1ed968ff669d2e2ba8a1483d0f3acc80c0/OracleJava/java-8/Dockerfile#L17-L19
    ln -sfT "$JAVA_HOME" /usr/java/default; \
    ln -sfT "$JAVA_HOME" /usr/java/latest; \
    for bin in "$JAVA_HOME/bin/"*; do \
        base="$(basename"$bin")"; \
        [! -e "/usr/bin/$base"]; \
        alternatives --install "/usr/bin/$base" "$base" "$bin" 20000; \
    done; \
    \
# basic smoke test
    javac -version; \
    java -version
  • 写完之后执行 <font color=”blue”>docker build -t bolingcavalry/centos7.6-jdk8:0.0.1 .</font> 即可生成镜像,如果您有 hub.docker.com 的账号,还能够将其推送到地方仓库,给更多人应用
  • 用 history 命令看看镜像内容,详情如下,共计五百多兆,曾经不小了:
will@Mac-mini$ docker history bolingcavalry/centos7.6-jdk8:0.0.1
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
a5dead4a6505   2 days ago    /bin/sh -c set -eux;         arch="$(objdump…   209MB     
<missing>      2 days ago    /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B        
<missing>      2 days ago    /bin/sh -c #(nop)  ENV PATH=/usr/java/openjd…   0B        
<missing>      2 days ago    /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/java/o…   0B        
<missing>      2 days ago    /bin/sh -c set -eux;     yum install -y     …   144MB     
<missing>      2 years ago   /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      2 years ago   /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      2 years ago   /bin/sh -c #(nop) ADD file:54b004357379717df…   202MB
  • 我这里曾经推送到 hub.docker.com 下来了,执行以下命令即可下载到本地:
docker pull bolingcavalry/centos7.6-jdk8:0.0.3

CentOS7+JDK8+OpenCV4 镜像

  • 接下来能够集成 OpenCV4 了,这里有两个关键点须要留神:
  1. 受到 JavaCV 依赖的束缚,OpenCV 的版本要用 <font color=”red”>4.5.3</font>
  2. OpenCV 编译的时候要求 cmake 版本是 3.x,因而须要下载 cmake 对应版本
  • 最终,Dockerfile 内容如下,根底镜像是后面做好的 <font color=”blue”>bolingcavalry/centos7.6-jdk8:0.0.1</font>,先是装置一大堆编译所需的利用,而后下载 cmake 并装置,再下载 OpenCV-4.5.3 版本的源码而后编译,就这么简略(但其间的调试工作还是不少的,不说了,说多了都是泪):
FROM bolingcavalry/centos7.6-jdk8:0.0.1

RUN echo "export LC_ALL=en_US.UTF-8"  >>  /etc/profile \
    && source /etc/profile

RUN set -eux; \
    yum install -y \
        make \
        gcc \
        gcc-c++ \
        gtk+-devel \
        gimp-devel \
        gimp-devel-tools \
        gimp-help-browser \
        zlib-devel \
        libtiff-devel \
        libjpeg-devel \
        libpng-devel \
        gstreamer-devel \
        libavc1394-devel \
        libraw1394-devel \
        libdc1394-devel \
        jasper-devel \
        jasper-utils \
        swig \
        python \
        libtool \
        nasm \
        build-essential \
        ant \
        unzip \
    ;

RUN set -eux; \
    curl -fL -o cmake-3.12.2-Linux-x86_64.tar.gz https://cmake.org/files/v3.12/cmake-3.12.2-Linux-x86_64.tar.gz \
    && tar -zxvf cmake-3.12.2-Linux-x86_64.tar.gz \
    && mv cmake-3.12.2-Linux-x86_64 cmake-3.12.2 \
    && ln -sf /cmake-3.12.2/bin/* /usr/bin; \
    curl -fL -o opencv-4.5.3.zip https://codeload.github.com/opencv/opencv/zip/4.5.3; \
    unzip opencv-4.5.3.zip; \
    rm -rf opencv-4.5.3.zip; \
    cd opencv-4.5.3; \
    mkdir build; \
    cd build; \
    cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..; \
    make; \
    make install; \
    cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..;\
    make -j8; \
    make install
  • 执行命令 <font color=”blue”>docker build -t bolingcavalry/opencv4.5.3:0.0.1 .</font> 即可生成镜像,如果您有 hub.docker.com 的账号,还能够将其推送到地方仓库,给更多人应用
  • 用 history 命令看看镜像内容,详情如下,倒吸一口凉气,这么大的体积,敬爱的读者们会不会打死我 …:
will@Mac-mini centos7-jdk8 % docker history bolingcavalry/opencv4.5.3:0.0.1
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
d1518ffa4699   5 days ago     RUN /bin/sh -c set -eux;     curl -fL -o cma…   819MB     buildkit.dockerfile.v0
<missing>      5 days ago     RUN /bin/sh -c set -eux;     yum install -y …   637MB     buildkit.dockerfile.v0
<missing>      5 days ago     RUN /bin/sh -c echo "export LC_ALL=en_US.UTF…   1.84kB    buildkit.dockerfile.v0
<missing>      3 months ago   /bin/sh -c set -eux;         arch="$(objdump…   209MB     
<missing>      3 months ago   /bin/sh -c #(nop)  ENV LANG=C.UTF-8             0B        
<missing>      3 months ago   /bin/sh -c #(nop)  ENV PATH=/usr/java/openjd…   0B        
<missing>      3 months ago   /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/java/o…   0B        
<missing>      3 months ago   /bin/sh -c set -eux;     yum install -y     …   144MB     
<missing>      2 years ago    /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B        
<missing>      2 years ago    /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B        
<missing>      2 years ago    /bin/sh -c #(nop) ADD file:54b004357379717df…   202MB
  • 我这里曾经推送到 hub.docker.com 下来了,执行以下命令即可下载到本地:
docker pull bolingcavalry/opencv4.5.3:0.0.1
  • 这里要揭示一下,opencv 的编译是十分耗时的,请确保 docker 宿主机的性能不要太差,也请您急躁期待编译过程
  • 至此,合乎咱们要求的根底镜像 <font color=”blue”>opencv4.5.3:0.0.1</font> 已制作实现,有了它,咱们的 Java 利用所需的 jdk 和 opencv 就凑齐了,在开发 javacv 相干的利用时,以它为根底镜像就无需再为环境和依赖库操心,终于能够聚焦 java 开发了

你不孤独,欣宸原创一路相伴

  1. Java 系列
  2. Spring 系列
  3. Docker 系列
  4. kubernetes 系列
  5. 数据库 + 中间件系列
  6. DevOps 系列

欢送关注公众号:程序员欣宸

微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游 Java 世界 …
https://github.com/zq2599/blog_demos

退出移动版