当前位置:   article > 正文

制作JavaCV应用依赖的基础Docker镜像(CentOS7+JDK8+OpenCV4)_dockerfile java 启动需要opencv

dockerfile java 启动需要opencv

Java基础教程icon-default.png?t=LBL2https://www.xin3721.com/eschool/Javaxin3721/

 

欢迎访问我的GitHub

https://github.com/zq2599/blog_demos

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

本篇概览

  • 在《三分钟:极速体验JAVA版目标检测(YOLO4)》一文中,咱们体验了YOLO4强大的物体识别能力,如下图:

在这里插入图片描述

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

实战内容

  • 为了减少环境和软件差异的影响,让程序的运行调试更简单,也为了让应用可以在容器环境运行,最终整个应用会被制作成docker镜像,所以咱们的目标被设定为下面三项:
  1. 开发出java版的物体识别应用
  2. 将此应用制作成docker镜像
  3. 在docker环境运行这个应用
  • 基于上述目标,我们可以确定以下操作步骤:
  1. 准备好docker基础镜像
  2. 开发java应用
  3. 将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的所有内容,可见核心是根据不同的操作系统下载文件然后安装,逻辑简单清晰就不多说了:

  1. FROM centos:7.6.1810
  2. RUN set -eux; \
  3. yum install -y \
  4. gzip \
  5. tar \
  6. binutils \
  7. freetype fontconfig \
  8. ;
  9. ENV JAVA_HOME /usr/java/openjdk-8
  10. ENV PATH $JAVA_HOME/bin:$PATH
  11. # Default to UTF-8 file.encoding
  12. ENV LANG C.UTF-8
  13. RUN set -eux; \
  14. \
  15. arch="$(objdump="$(command -v objdump)" && objdump --file-headers "$objdump" | awk -F '[:,]+[[:space:]]+' '$1 == "architecture" { print $2 }')"; \
  16. case "$arch" in \
  17. 'i386:x86-64') \
  18. downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_8u292b10.tar.gz'; \
  19. ;; \
  20. 'aarch64') \
  21. downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_aarch64_linux_8u292b10.tar.gz'; \
  22. ;; \
  23. *) echo >&2 "error: unsupported architecture: '$arch'"; exit 1 ;; \
  24. esac; \
  25. \
  26. curl -fL -o openjdk.tgz "$downloadUrl"; \
  27. curl -fL -o openjdk.tgz.asc "$downloadUrl.sign"; \
  28. \
  29. export GNUPGHOME="$(mktemp -d)"; \
  30. # 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
  31. # (https://github.com/docker-library/openjdk/pull/322#discussion_r286839190)
  32. # we pre-fetch this so that the signature it makes on the OpenJDK key can survive "import-clean" in gpg
  33. gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAC843EBD3EFDB98CC772FADA5CD6035332FA671; \
  34. # 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?
  35. # no-self-sigs-only: https://salsa.debian.org/debian/gnupg2/commit/c93ca04a53569916308b369c8b218dad5ae8fe07
  36. gpg --batch --keyserver keyserver.ubuntu.com --keyserver-options no-self-sigs-only --recv-keys CA5F11C6CE22644D42C6AC4492EF8D39DC13168F; \
  37. gpg --batch --list-sigs --keyid-format 0xLONG CA5F11C6CE22644D42C6AC4492EF8D39DC13168F \
  38. | tee /dev/stderr \
  39. | grep '0xA5CD6035332FA671' \
  40. | grep 'Andrew Haley'; \
  41. gpg --batch --verify openjdk.tgz.asc openjdk.tgz; \
  42. rm -rf "$GNUPGHOME"; \
  43. \
  44. mkdir -p "$JAVA_HOME"; \
  45. tar --extract \
  46. --file openjdk.tgz \
  47. --directory "$JAVA_HOME" \
  48. --strip-components 1 \
  49. --no-same-owner \
  50. ; \
  51. rm openjdk.tgz*; \
  52. \
  53. rm -rf "$JAVA_HOME/jre/lib/security/cacerts"; \
  54. # see "update-ca-trust" script which creates/maintains this cacerts bundle
  55. ln -sT /etc/pki/ca-trust/extracted/java/cacerts "$JAVA_HOME/jre/lib/security/cacerts"; \
  56. \
  57. # https://github.com/oracle/docker-images/blob/a56e0d1ed968ff669d2e2ba8a1483d0f3acc80c0/OracleJava/java-8/Dockerfile#L17-L19
  58. ln -sfT "$JAVA_HOME" /usr/java/default; \
  59. ln -sfT "$JAVA_HOME" /usr/java/latest; \
  60. for bin in "$JAVA_HOME/bin/"*; do \
  61. base="$(basename "$bin")"; \
  62. [ ! -e "/usr/bin/$base" ]; \
  63. alternatives --install "/usr/bin/$base" "$base" "$bin" 20000; \
  64. done; \
  65. \
  66. # basic smoke test
  67. javac -version; \
  68. java -version
  • 写完之后执行docker build -t bolingcavalry/centos7.6-jdk8:0.0.1 .即可生成镜像,如果您有hub.docker.com的账号,还可以将其推送到中央仓库,给更多人使用

  • 用history命令看看镜像内容,详情如下,合计五百多兆,已经不小了:

  1. will@Mac-mini$ docker history bolingcavalry/centos7.6-jdk8:0.0.1
  2. IMAGE CREATED CREATED BY SIZE COMMENT
  3. a5dead4a6505 2 days ago /bin/sh -c set -eux; arch="$(objdump… 209MB
  4. <missing> 2 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
  5. <missing> 2 days ago /bin/sh -c #(nop) ENV PATH=/usr/java/openjd… 0B
  6. <missing> 2 days ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/java/o… 0B
  7. <missing> 2 days ago /bin/sh -c set -eux; yum install -y … 144MB
  8. <missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  9. <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
  10. <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的版本要用4.5.3
  2. OpenCV编译的时候要求cmake版本是3.x,因此需要下载cmake对应版本
  • 最终,Dockerfile内容如下,基础镜像是前面做好的bolingcavalry/centos7.6-jdk8:0.0.1,先是安装一大堆编译所需的应用,然后下载cmake并安装,再下载OpenCV-4.5.3版本的源码然后编译,就这么简单(但其间的调试工作还是不少的,不说了,说多了都是泪):
  1. FROM bolingcavalry/centos7.6-jdk8:0.0.1
  2. RUN echo "export LC_ALL=en_US.UTF-8" >> /etc/profile \
  3. && source /etc/profile
  4. RUN set -eux; \
  5. yum install -y \
  6. make \
  7. gcc \
  8. gcc-c++ \
  9. gtk+-devel \
  10. gimp-devel \
  11. gimp-devel-tools \
  12. gimp-help-browser \
  13. zlib-devel \
  14. libtiff-devel \
  15. libjpeg-devel \
  16. libpng-devel \
  17. gstreamer-devel \
  18. libavc1394-devel \
  19. libraw1394-devel \
  20. libdc1394-devel \
  21. jasper-devel \
  22. jasper-utils \
  23. swig \
  24. python \
  25. libtool \
  26. nasm \
  27. build-essential \
  28. ant \
  29. unzip \
  30. ;
  31. RUN set -eux; \
  32. 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 \
  33. && tar -zxvf cmake-3.12.2-Linux-x86_64.tar.gz \
  34. && mv cmake-3.12.2-Linux-x86_64 cmake-3.12.2 \
  35. && ln -sf /cmake-3.12.2/bin/* /usr/bin; \
  36. curl -fL -o opencv-4.5.3.zip https://codeload.github.com/opencv/opencv/zip/4.5.3; \
  37. unzip opencv-4.5.3.zip; \
  38. rm -rf opencv-4.5.3.zip; \
  39. cd opencv-4.5.3; \
  40. mkdir build; \
  41. cd build; \
  42. cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..; \
  43. make; \
  44. make install; \
  45. cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..;\
  46. make -j8; \
  47. make install
  • 执行命令docker build -t bolingcavalry/opencv4.5.3:0.0.1 .即可生成镜像,如果您有hub.docker.com的账号,还可以将其推送到中央仓库,给更多人使用

  • 用history命令看看镜像内容,详情如下,倒吸一口凉气,这么大的体积,亲爱的读者们会不会打死我...:

  1. will@Mac-mini centos7-jdk8 % docker history bolingcavalry/opencv4.5.3:0.0.1
  2. IMAGE CREATED CREATED BY SIZE COMMENT
  3. d1518ffa4699 5 days ago RUN /bin/sh -c set -eux; curl -fL -o cma… 819MB buildkit.dockerfile.v0
  4. <missing> 5 days ago RUN /bin/sh -c set -eux; yum install -y … 637MB buildkit.dockerfile.v0
  5. <missing> 5 days ago RUN /bin/sh -c echo "export LC_ALL=en_US.UTF… 1.84kB buildkit.dockerfile.v0
  6. <missing> 3 months ago /bin/sh -c set -eux; arch="$(objdump… 209MB
  7. <missing> 3 months ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
  8. <missing> 3 months ago /bin/sh -c #(nop) ENV PATH=/usr/java/openjd… 0B
  9. <missing> 3 months ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/java/o… 0B
  10. <missing> 3 months ago /bin/sh -c set -eux; yum install -y … 144MB
  11. <missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
  12. <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
  13. <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宿主机的性能不要太差,也请您耐心等待编译过程

  • 至此,符合咱们要求的基础镜像opencv4.5.3:0.0.1已制作完成,有了它,咱们的Java应用所需的jdk和opencv就凑齐了,在开发javacv相关的应用时,以它为基础镜像就无需再为环境和依赖库操心,终于可以聚焦java开发了
     

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小小林熬夜学编程/article/detail/108037
推荐阅读
相关标签
  

闽ICP备14008679号