这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos
本篇概览
-
如果您看过《三分钟极速体验:Java版人脸检测》一文,甚至动手实际操作过,您应该会对背后的技术细节感兴趣,接下来就请随欣宸一起动手实战,从无到有将这个应用开发出来;
-
首先确定咱们的目标:
-
开发出java版的人脸检测应用
-
将此应用制作成docker镜像
-
在docker环境运行这个应用
- 基于上述目标,我们可以确定以下操作步骤:
-
准备好docker基础镜像
-
开发java应用
-
将java应用打包成package文件,集成到基础镜像中,得到最终的java应用镜像
- 本篇的目标就是上述第一步:准备好docker基础镜像
关于人脸检测应用的基础镜像
- 如果您有过制作java应用镜像的经历,一定会产生疑问:如下图红框所示,一般不都是把OpenJDK的官方镜像作为基础镜像吗?为啥要拿一篇文章来讲基础镜像的事情?
-
对于人脸检测的应用来说,OpenJDK的官方镜像是不够用的,因为用java实现人脸检测需要一个关键技术:javacv,在javacv运行过程中需要用到opencv的一些本地库,因此需要在运行环境中安装opencv
-
如下图所示,一个人脸检测应用自下而上由以下六部分构成,如果将底部的操作系统、JDK、OpenCV做成基础镜像就方便多了,咱们开发应用的时候只要需关注上面三层即可,而上面三层不就是个普通的maven工程吗?
- 至此,聪明的您对接下来要做的事情应该很清楚了:编写Dockerfile文件用来制作镜像,这个镜像中要有CentOS + JDK1.8 + OpenCV
分两步走
-
我打算先做一个CentOS + JDK的镜像,在此基础上再做一个集成了OpenCV的镜像,这样在一些不需要OpenCV的场景中,我还能单独使用CentOS + JDK1.8的镜像
-
分析完成,开始动手吧
CentOS + JDK的镜像
-
之所以选择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 J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH
Default to UTF-8 file.encoding
ENV LANG C.UTF-8
RUN set -eux; \
\
arch=“ ( o b j d u m p = " (objdump=" (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=“ ( b a s e n a m e " (basename " (basename"bin”)"; \
[ ! -e “/usr/bin/$base” ]; \
alternatives --install “/usr/bin/ b a s e " " base" " base""base” “$bin” 20000; \
done; \
\
basic smoke test
javac -version; \
java -version
-
写完之后执行docker build -t bolingcavalry/centos7.6-jdk8:0.0.1 .即可生成镜像,如果您有hub.docker.com的账号,还可以将其推送到中央仓库,给更多人使用
-
用history命令看看镜像内容,详情如下,合计五百多兆,已经不小了:
CN0014009475M:~ will$ 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
2 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B
2 days ago /bin/sh -c #(nop) ENV PATH=/usr/java/openjd… 0B
2 days ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/java/o… 0B
2 days ago /bin/sh -c set -eux; yum install -y … 144MB
2 years ago /bin/sh -c #(nop) CMD [“/bin/bash”] 0B
2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
2 years ago /bin/sh -c #(nop) ADD file:54b004357379717df… 202MB
- 我这里已经推送到hub.docker.com上去了,执行以下命令即可下载到本地:
docker pull bolingcavalry/centos7.6-jdk8:0.0.3
最后
学习视频:
大厂面试真题:
-c #(nop) ADD file:54b004357379717df… 202MB
- 我这里已经推送到hub.docker.com上去了,执行以下命令即可下载到本地:
docker pull bolingcavalry/centos7.6-jdk8:0.0.3
最后
学习视频:
[外链图片转存中…(img-t7T3I8aT-1714379390688)]
大厂面试真题:
[外链图片转存中…(img-vR8eaLCp-1714379390688)]