[Docker] build image找不到設(shè)置的openjdk8-jre版本

Pipeline 紅過夜的一次記錄

2019年03月18日周一晚上提交代碼摊崭,pipeline 掛了坪圾。

error image.png

根據(jù)圖上的信息晓折,我們知道了Dockerfile中設(shè)置的apk add --no-cache 'openjdk8-jre=8.191.12-r0' 沒有找到安裝包惑朦,提示說可以使用openjdk8-jre-8.201.08-r0[openjdk8-jre] 這個版本。相應(yīng)的也需要將上一步中ENV JAVA_VERSION 8u191設(shè)置為對應(yīng)的版本漓概。

使用提示信息中的版本.png

此時漾月,按照提示更改后,成功的build image胃珍。
但是梁肿,在第二個運行測試的Job中,pipeline又掛了觅彰。
Dockerfile中的java環(huán)境就是為SonarQube設(shè)置的吩蔑,現(xiàn)在發(fā)現(xiàn)Sonar不能正常運行,腦子里想到了一些問題:

  • Sonar需要的Java版本必須是固定的填抬?
  • 為什么下載不到之前設(shè)置的8u191 openjdk 版本烛芬?
  • 如何讓pipeline正常運行通過?
sonar-scanner 運行失敗.png

Dockerfile 信息

因為項目的原因痴奏,使用的是node-alpine為基礎(chǔ)鏡像蛀骇,然后安裝了SonarQube進行代碼分析厌秒。
安裝docker-sonar-scanner Dockerfile的參考github repo newtmitch/docker-sonar-scanner

FROM node:8.12.0-alpine
WORKDIR /app
RUN cd /app \
    && apk update \
    && apk add --no-cache curl unzip

# Porperty for JDK
# Default to UTF-8 file.encoding
ENV LANG C.UTF-8
RUN { \
        echo '#!/bin/sh'; \
        echo 'set -e'; \
        echo; \
        echo 'dirname "$(dirname "$(readlink -f "$(which javac || which java)")")"'; \
    } > /usr/local/bin/docker-java-home \
    && chmod +x /usr/local/bin/docker-java-home

ENV JAVA_HOME /usr/lib/jvm/java-1.8-openjdk/jre
ENV PATH $PATH:/usr/lib/jvm/java-1.8-openjdk/jre/bin:/usr/lib/jvm/java-1.8-openjdk/bin
ENV JAVA_VERSION 8u201

RUN set -x \
    && apk add --no-cache openjdk8-jre=8.201.08-r0 \
    && [ "$JAVA_HOME" = "$(docker-java-home)" ]

# Install sonar-scanner
RUN curl --insecure -o ./sonarscanner.zip -L https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/sonar-scanner-cli-3.0.3.778-linux.zip && \
    unzip sonarscanner.zip && \
    rm sonarscanner.zip && \
    mv sonar-scanner-3.0.3.778-linux sonar-scanner

ENV SONAR_RUNNER_HOME=/app/sonar-scanner
ENV PATH $PATH:/app/sonar-scanner/bin

COPY ./sonar-project.properties /app/sonar-scanner/conf/sonar-scanner.properties

#   ensure Sonar uses the provided Java for musl instead of a borked glibc one
RUN sed -i 's/use_embedded_jre=true/use_embedded_jre=false/g' /app/sonar-scanner/bin/sonar-scanner

解決問題的過程

openjdk8-jre版本問題分析

對于沒有玩過linux的我读拆,用apk 安裝的包是從哪里找到的,需要搞清楚鸵闪。

image.png

由這個圖直觀的看到:
第一個網(wǎng)站是openjdk8-jre檐晕,顯示是5天前進行了更新,已經(jīng)是8.201.08-r0版本了蚌讼,
第二個網(wǎng)站是openjdk-jre-base辟灰,看上去是還有8.191.12-r0 版本,但是點擊進去也是8.201.08-r0版本了篡石。
image.png

Alpine Linux Package 里面搜索openjdk8-jre,發(fā)現(xiàn)在2019年03月14日更新為8.201.08-r0版本芥喇,而且找不到舊版本8.191.12-r0了。
所以build image的時候 pipeline在安裝舊版本的openjdk8-jre的時候掛了凰萨。

image.png
Sonar-scanner 運行失敗問題分析

根據(jù)詳細的Error信息继控,可以知道是

java.lang.ExceptionInInitializerError  
Caused by: java.security.ProviderException: Could not initialize NSS
Caused by: java.io.FileNotFoundException: /usr/lib/libnss3.so

看到這個錯誤信息一臉懵逼,也不知道是為什么胖眷,最后在github上找到了一個類似的issue武通,是關(guān)于docker openjdk的,issue 創(chuàng)建時間是3天前珊搀,大概是2019年03月17日docker-library / openjdk / issue - Missing libnss3.so after updating openjdk:8-jdk-alpine image

image.png

issue的評論中冶忱,有人說自己手動在dockerfile中install nss可以覺得這個問題,嘗試了一下境析,也解決了我所面臨的問題囚枪,sonar-scanner可以正常運行了派诬。

RUN apk add --no-cache nss

有人直接po出了上游問題,是在Alpine Linux中提出的眶拉。

Looks like someone filed a bug upstream about this https://bugs.alpinelinux.org/issues/10126

思考

早上和TL說在整理這篇文章千埃,TL說這個不是正確的解決方式,因為如果openjdk8-jre的版本又突然間本改變呢忆植?我們又會重復(fù)面臨這個問題放可。從長遠角度考慮,應(yīng)該是要選擇長期穩(wěn)定的jdk版本才是解決之道朝刊。

附上詳細的Error信息:

ERROR: Error during SonarQube Scanner execution
java.lang.ExceptionInInitializerError
    at sun.security.ssl.SSLSessionImpl.<init>(SSLSessionImpl.java:188)
    at sun.security.ssl.SSLSessionImpl.<init>(SSLSessionImpl.java:152)
    at sun.security.ssl.SSLSessionImpl.<clinit>(SSLSessionImpl.java:79)
    at sun.security.ssl.SSLSocketImpl.init(SSLSocketImpl.java:598)
    at sun.security.ssl.SSLSocketImpl.<init>(SSLSocketImpl.java:566)
    at sun.security.ssl.SSLSocketFactoryImpl.createSocket(SSLSocketFactoryImpl.java:110)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.connection.RealConnection.connectTls(RealConnection.java:256)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.connection.RealConnection.establishProtocol(RealConnection.java:237)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.connection.RealConnection.connect(RealConnection.java:148)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:186)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:121)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.connection.StreamAllocation.newStream(StreamAllocation.java:100)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:120)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:92)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:67)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.RealCall.getResponseWithInterceptorChain(RealCall.java:179)
    at org.sonarsource.scanner.api.internal.shaded.okhttp.RealCall.execute(RealCall.java:63)
    at org.sonarsource.scanner.api.internal.ServerConnection.callUrl(ServerConnection.java:113)
    at org.sonarsource.scanner.api.internal.ServerConnection.downloadString(ServerConnection.java:98)
    at org.sonarsource.scanner.api.internal.Jars.getBootstrapIndex(Jars.java:96)
    at org.sonarsource.scanner.api.internal.Jars.getScannerEngineFiles(Jars.java:76)
    at org.sonarsource.scanner.api.internal.Jars.download(Jars.java:70)
    at org.sonarsource.scanner.api.internal.JarDownloader.download(JarDownloader.java:39)
    at org.sonarsource.scanner.api.internal.IsolatedLauncherFactory$1.run(IsolatedLauncherFactory.java:75)
    at org.sonarsource.scanner.api.internal.IsolatedLauncherFactory$1.run(IsolatedLauncherFactory.java:71)
    at java.security.AccessController.doPrivileged(Native Method)
    at org.sonarsource.scanner.api.internal.IsolatedLauncherFactory.createLauncher(IsolatedLauncherFactory.java:71)
    at org.sonarsource.scanner.api.internal.IsolatedLauncherFactory.createLauncher(IsolatedLauncherFactory.java:67)
    at org.sonarsource.scanner.api.EmbeddedScanner.doStart(EmbeddedScanner.java:218)
    at org.sonarsource.scanner.api.EmbeddedScanner.start(EmbeddedScanner.java:156)
    at org.sonarsource.scanner.cli.Main.execute(Main.java:74)
    at org.sonarsource.scanner.cli.Main.main(Main.java:61)
Caused by: java.security.ProviderException: Could not initialize NSS
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:223)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:103)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:224)
    at sun.security.jca.ProviderConfig$2.run(ProviderConfig.java:206)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.security.jca.ProviderConfig.doLoadProvider(ProviderConfig.java:206)
    at sun.security.jca.ProviderConfig.getProvider(ProviderConfig.java:187)
    at sun.security.jca.ProviderList.getProvider(ProviderList.java:233)
    at sun.security.jca.ProviderList.getIndex(ProviderList.java:263)
    at sun.security.jca.ProviderList.getProviderConfig(ProviderList.java:247)
    at sun.security.jca.ProviderList.getProvider(ProviderList.java:253)
    at java.security.Security.getProvider(Security.java:503)
    at sun.security.ssl.SignatureAndHashAlgorithm.<clinit>(SignatureAndHashAlgorithm.java:415)
    ... 40 more
Caused by: java.io.FileNotFoundException: /usr/lib/libnss3.so
    at sun.security.pkcs11.Secmod.initialize(Secmod.java:193)
    at sun.security.pkcs11.SunPKCS11.<init>(SunPKCS11.java:218)
    ... 56 more
ERROR: 
ERROR: Re-run SonarQube Scanner using the -X switch to enable full debug logging.
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末耀里,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子拾氓,更是在濱河造成了極大的恐慌冯挎,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,080評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件咙鞍,死亡現(xiàn)場離奇詭異房官,居然都是意外死亡,警方通過查閱死者的電腦和手機续滋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,422評論 3 385
  • 文/潘曉璐 我一進店門翰守,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人疲酌,你說我怎么就攤上這事蜡峰。” “怎么了朗恳?”我有些...
    開封第一講書人閱讀 157,630評論 0 348
  • 文/不壞的土叔 我叫張陵湿颅,是天一觀的道長。 經(jīng)常有香客問我粥诫,道長油航,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,554評論 1 284
  • 正文 為了忘掉前任怀浆,我火速辦了婚禮谊囚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘揉稚。我一直安慰自己秒啦,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,662評論 6 386
  • 文/花漫 我一把揭開白布搀玖。 她就那樣靜靜地躺著余境,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上芳来,一...
    開封第一講書人閱讀 49,856評論 1 290
  • 那天含末,我揣著相機與錄音,去河邊找鬼即舌。 笑死佣盒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的顽聂。 我是一名探鬼主播肥惭,決...
    沈念sama閱讀 39,014評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼紊搪!你這毒婦竟也來了蜜葱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,752評論 0 268
  • 序言:老撾萬榮一對情侶失蹤耀石,失蹤者是張志新(化名)和其女友劉穎牵囤,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滞伟,經(jīng)...
    沈念sama閱讀 44,212評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡揭鳞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,541評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了梆奈。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片野崇。...
    茶點故事閱讀 38,687評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖鉴裹,靈堂內(nèi)的尸體忽然破棺而出舞骆,到底是詐尸還是另有隱情钥弯,我是刑警寧澤径荔,帶...
    沈念sama閱讀 34,347評論 4 331
  • 正文 年R本政府宣布,位于F島的核電站脆霎,受9級特大地震影響总处,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜睛蛛,卻給世界環(huán)境...
    茶點故事閱讀 39,973評論 3 315
  • 文/蒙蒙 一鹦马、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧忆肾,春花似錦荸频、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,777評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春和悦,著一層夾襖步出監(jiān)牢的瞬間退疫,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,006評論 1 266
  • 我被黑心中介騙來泰國打工鸽素, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留褒繁,地道東北人。 一個月前我還...
    沈念sama閱讀 46,406評論 2 360
  • 正文 我出身青樓馍忽,卻偏偏與公主長得像棒坏,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子遭笋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,576評論 2 349