Java版人臉檢測(cè)詳解上篇:運(yùn)行環(huán)境的Docker鏡像(CentOS+JDK+OpenCV)

歡迎訪問(wèn)我的GitHub

https://github.com/zq2599/blog_demos

內(nèi)容:所有原創(chuàng)文章分類(lèi)匯總及配套源碼针炉,涉及Java床绪、Docker、Kubernetes、DevOPS等;

本篇概覽

  • 如果您看過(guò)《三分鐘極速體驗(yàn):Java版人臉檢測(cè)》一文,甚至動(dòng)手實(shí)際操作過(guò),您應(yīng)該會(huì)對(duì)背后的技術(shù)細(xì)節(jié)感興趣,接下來(lái)就請(qǐng)隨欣宸一起動(dòng)手實(shí)戰(zhàn)度陆,從無(wú)到有將這個(gè)應(yīng)用開(kāi)發(fā)出來(lái);
  • 首先確定咱們的目標(biāo):
  1. 開(kāi)發(fā)出java版的人臉檢測(cè)應(yīng)用
  2. 將此應(yīng)用制作成docker鏡像
  3. 在docker環(huán)境運(yùn)行這個(gè)應(yīng)用
  • 基于上述目標(biāo)献幔,我們可以確定以下操作步驟:
  1. 準(zhǔn)備好docker基礎(chǔ)鏡像
  2. 開(kāi)發(fā)java應(yīng)用
  3. 將java應(yīng)用打包成package文件懂傀,集成到基礎(chǔ)鏡像中,得到最終的java應(yīng)用鏡像
  • 本篇的目標(biāo)就是上述第一步:<font color="blue">準(zhǔn)備好docker基礎(chǔ)鏡像</font>

關(guān)于人臉檢測(cè)應(yīng)用的基礎(chǔ)鏡像

  • 如果您有過(guò)制作java應(yīng)用鏡像的經(jīng)歷蜡感,一定會(huì)產(chǎn)生疑問(wèn):如下圖紅框所示蹬蚁,一般不都是把OpenJDK的官方鏡像作為基礎(chǔ)鏡像嗎?為啥要拿一篇文章來(lái)講基礎(chǔ)鏡像的事情郑兴?
在這里插入圖片描述
  • 對(duì)于人臉檢測(cè)的應(yīng)用來(lái)說(shuō)犀斋,OpenJDK的官方鏡像是不夠用的,因?yàn)橛胘ava實(shí)現(xiàn)人臉檢測(cè)需要一個(gè)關(guān)鍵技術(shù):<font color="red">javacv</font>情连,在javacv運(yùn)行過(guò)程中需要用到opencv的一些本地庫(kù)叽粹,因此需要在運(yùn)行環(huán)境中安裝opencv

  • 如下圖所示,一個(gè)人臉檢測(cè)應(yīng)用自下而上由以下六部分構(gòu)成却舀,如果將底部的操作系統(tǒng)虫几、JDK、OpenCV做成基礎(chǔ)鏡像就方便多了挽拔,咱們開(kāi)發(fā)應(yīng)用的時(shí)候只要需關(guān)注上面三層即可辆脸,而上面三層不就是個(gè)普通的maven工程嗎?

在這里插入圖片描述
  • 至此篱昔,聰明的您對(duì)接下來(lái)要做的事情應(yīng)該很清楚了:編寫(xiě)Dockerfile文件用來(lái)制作鏡像每强,這個(gè)鏡像中要有<font color="blue">CentOS + JDK1.8 + OpenCV</font>

分兩步走

  • 我打算先做一個(gè)CentOS + JDK的鏡像始腾,在此基礎(chǔ)上再做一個(gè)集成了OpenCV的鏡像州刽,這樣在一些不需要OpenCV的場(chǎng)景中,我還能單獨(dú)使用CentOS + JDK1.8的鏡像
  • 分析完成浪箭,開(kāi)始動(dòng)手吧

CentOS + JDK的鏡像

  • 之所以選擇CentOS作為操作系統(tǒng)穗椅,是因?yàn)槠綍r(shí)工作中最常用的就是它了

  • 縱觀OpenJDK官方的各種鏡像,并沒(méi)有發(fā)現(xiàn)CentOS作為操作系統(tǒng)的奶栖,因此自己動(dòng)手吧匹表,思路很簡(jiǎn)單:找到OpenJDK的Dockerfile文件门坷,把它的基礎(chǔ)鏡像換成CentOS7.6即可

  • 以下是Dockerfile的所有內(nèi)容,可見(jiàn)核心是根據(jù)不同的操作系統(tǒng)下載文件然后安裝袍镀,邏輯簡(jiǎn)單清晰就不多說(shuō)了:

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
  • 寫(xiě)完之后執(zhí)行<font color="blue">docker build -t bolingcavalry/centos7.6-jdk8:0.0.1 .</font>即可生成鏡像默蚌,如果您有hub.docker.com的賬號(hào),還可以將其推送到中央倉(cāng)庫(kù)苇羡,給更多人使用

  • 用history命令看看鏡像內(nèi)容绸吸,詳情如下,合計(jì)五百多兆设江,已經(jīng)不小了:

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     
<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
  • 我這里已經(jīng)推送到hub.docker.com上去了锦茁,執(zhí)行以下命令即可下載到本地:
docker pull bolingcavalry/centos7.6-jdk8:0.0.3

CentOS+JDK+OpenCV鏡像

  • 接下來(lái)可以集成OpenCV了,Dockerfile內(nèi)容如下所示叉存,基礎(chǔ)鏡像是剛剛做好的<font color="blue">bolingcavalry/centos7.6-jdk8:0.0.1</font>码俩,先是安裝一大堆編譯所需的應(yīng)用,然后下載OpenCV-3.4.3版本的源碼歼捏,然后編譯稿存,就這么簡(jiǎn)單(但其間的調(diào)試工作還是不少的,不說(shuō)了瞳秽,說(shuō)多了都是淚):
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 \
        cmake \
        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 opencv-3.4.3.zip https://codeload.github.com/opencv/opencv/zip/3.4.3; \
    unzip opencv-3.4.3.zip; \
    rm -rf opencv-3.4.3.zip; \
    cd opencv-3.4.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
  • 寫(xiě)完之后執(zhí)行<font color="blue">docker build -t bolingcavalry/opencv3.4.3:0.0.3 .</font>即可生成鏡像挠铲,如果您有hub.docker.com的賬號(hào),還可以將其推送到中央倉(cāng)庫(kù)寂诱,給更多人使用
  • 用history命令看看鏡像內(nèi)容拂苹,詳情如下,倒吸一口涼氣痰洒,這么大的體積瓢棒,親愛(ài)的讀者們會(huì)不會(huì)打死我...:
CN0014009475M:~ will$ docker history bolingcavalry/opencv3.4.3:0.0.3
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
f0306d7a2594   2 days ago    /bin/sh -c set -eux;     curl -fL -o opencv-…   2.99GB    
<missing>      2 days ago    /bin/sh -c set -eux;     yum install -y     …   638MB     
<missing>      2 days ago    /bin/sh -c echo "export LC_ALL=en_US.UTF-8" …   1.84kB    
<missing>      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
  • 我這里已經(jīng)推送到hub.docker.com上去了,執(zhí)行以下命令即可下載到本地:
docker pull bolingcavalry/opencv3.4.3:0.0.3
  • 這里要提醒一下丘喻,opencv的編譯是非常耗時(shí)的脯宿,請(qǐng)確保docker宿主機(jī)的性能不要太差,也請(qǐng)您耐心等待編譯過(guò)程
  • 至此泉粉,符合咱們要求的基礎(chǔ)鏡像<font color="blue">bolingcavalry/opencv3.4.3:0.0.3</font>已制作完成连霉,有了它,咱們的Java應(yīng)用所需的jdk和opencv就湊齊了嗡靡,接下來(lái)的文章咱們一起去開(kāi)發(fā)這個(gè)人臉檢測(cè)的應(yīng)用吧跺撼;

你不孤單,欣宸原創(chuàng)一路相伴

  1. Java系列
  2. Spring系列
  3. Docker系列
  4. kubernetes系列
  5. 數(shù)據(jù)庫(kù)+中間件系列
  6. DevOps系列

歡迎關(guān)注公眾號(hào):程序員欣宸

微信搜索「程序員欣宸」讨彼,我是欣宸歉井,期待與您一同暢游Java世界...
https://github.com/zq2599/blog_demos

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哈误,隨后出現(xiàn)的幾起案子哩至,更是在濱河造成了極大的恐慌躏嚎,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,968評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件菩貌,死亡現(xiàn)場(chǎng)離奇詭異卢佣,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)箭阶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)珠漂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人尾膊,你說(shuō)我怎么就攤上這事媳危。” “怎么了冈敛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 153,220評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵待笑,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抓谴,道長(zhǎng)暮蹂,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,416評(píng)論 1 279
  • 正文 為了忘掉前任癌压,我火速辦了婚禮仰泻,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘滩届。我一直安慰自己集侯,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,425評(píng)論 5 374
  • 文/花漫 我一把揭開(kāi)白布帜消。 她就那樣靜靜地躺著棠枉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泡挺。 梳的紋絲不亂的頭發(fā)上辈讶,一...
    開(kāi)封第一講書(shū)人閱讀 49,144評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音娄猫,去河邊找鬼贱除。 笑死,一個(gè)胖子當(dāng)著我的面吹牛媳溺,可吹牛的內(nèi)容都是我干的月幌。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評(píng)論 3 401
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼褂删,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼飞醉!你這毒婦竟也來(lái)了冲茸?” 一聲冷哼從身側(cè)響起屯阀,我...
    開(kāi)封第一講書(shū)人閱讀 37,088評(píng)論 0 261
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤缅帘,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后难衰,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體钦无,經(jīng)...
    沈念sama閱讀 43,586評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,028評(píng)論 2 325
  • 正文 我和宋清朗相戀三年盖袭,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了失暂。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,137評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鳄虱,死狀恐怖弟塞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情拙已,我是刑警寧澤决记,帶...
    沈念sama閱讀 33,783評(píng)論 4 324
  • 正文 年R本政府宣布,位于F島的核電站倍踪,受9級(jí)特大地震影響系宫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜建车,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,343評(píng)論 3 307
  • 文/蒙蒙 一扩借、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧缤至,春花似錦潮罪、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,333評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至戒突,卻和暖如春屯碴,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背膊存。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,559評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工导而, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人隔崎。 一個(gè)月前我還...
    沈念sama閱讀 45,595評(píng)論 2 355
  • 正文 我出身青樓今艺,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親爵卒。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虚缎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,901評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容