自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

構(gòu)建Java鏡像的10個(gè)優(yōu)秀實(shí)踐

新聞 前端
你想構(gòu)建一個(gè)Java應(yīng)用程序并在Docker中運(yùn)行它嗎?你知道在使用Docker構(gòu)建Java容器有哪些最佳實(shí)踐?

 [[398153]]

你想構(gòu)建一個(gè)Java應(yīng)用程序并在Docker中運(yùn)行它嗎?你知道在使用Docker構(gòu)建Java容器有哪些最佳實(shí)踐?

在下面的速查表中,我將為你提供構(gòu)建生產(chǎn)級(jí)Java容器的最佳實(shí)踐,旨在優(yōu)化和保護(hù)要投入生產(chǎn)環(huán)境中的Docker鏡像。

構(gòu)建Java鏡像的10個(gè)最佳實(shí)踐

1.Docker鏡像使用確定性的標(biāo)簽

2.在Java鏡像中僅安裝需要的內(nèi)容

3.查找并修復(fù)Java鏡像中的安全漏洞

4.使用多階段構(gòu)建Java鏡像

5.不要以root用戶身份運(yùn)行Java應(yīng)用程序

6.Java應(yīng)用程序不要使用PID為1的進(jìn)程

7.優(yōu)雅下線Java應(yīng)用程序

8.使用 .dockerignore文件

9.確保Java版本支持容器

10.謹(jǐn)慎使用容器自動(dòng)化生成工具

構(gòu)建一個(gè)簡(jiǎn)單的Java容器鏡像

讓我們從簡(jiǎn)單的Dockerfile開(kāi)始,在構(gòu)建Java容器時(shí),我們經(jīng)常會(huì)有如下類(lèi)似的內(nèi)容:

  1. FROM maven 
  2.  
  3. RUN mkdir /app 
  4.  
  5. WORKDIR /app 
  6.  
  7. COPY . /app 
  8.  
  9. RUN mvn clean install 
  10.  
  11. CMD "mvn" "exec:java" 
  12.  
  13. Copy that to a file named Dockerfile, then build and run it. 
  14.  
  15. $ docker build . -t java-application 
  16.  
  17. $ docker run -p 8080:8080 java-application 

這很簡(jiǎn)單,而且有效。但是,此鏡像充滿錯(cuò)誤。

我們不僅應(yīng)該了解如何正確使用Maven,而且還應(yīng)避免像上述示例那樣構(gòu)建Java容器。

下面,讓我們開(kāi)始逐步改進(jìn)這個(gè)Dockerfile,使你的Java應(yīng)用程序生成高效,安全的Docker鏡像。

1.Docker鏡像使用確定性的標(biāo)簽

當(dāng)使用Maven構(gòu)建Java容器鏡像時(shí),我們首先需要基于Maven鏡像。但是,你知道使用Maven基本鏡像時(shí)實(shí)際上引入了哪些內(nèi)容嗎?

當(dāng)你使用下面的代碼行構(gòu)建鏡像時(shí),你將獲得該Maven鏡像的最新版本:

FROM maven

這似乎是一個(gè)有趣的功能,但是這種采用Maven默認(rèn)鏡像的策略可能存在一些潛在問(wèn)題:

  • 你的Docker構(gòu)建不是冪等的。這意味著每次構(gòu)建的結(jié)果可能會(huì)完全不同,今天的最新鏡像可能不同于明天或下周的最新鏡像,導(dǎo)致你的應(yīng)用程序的字節(jié)碼也是不同的,并且可能發(fā)生意外。因此,構(gòu)建鏡像時(shí),我們希望具有可復(fù)制的確定性行為。
  • Maven Docker鏡像是基于完整的操作系統(tǒng)鏡像。這樣會(huì)導(dǎo)致許多其他二進(jìn)制文件出現(xiàn)在最終的生產(chǎn)鏡像中,但是運(yùn)行你的Java應(yīng)用程序不需要很多這些二進(jìn)制文件。因此,將它們作為Java容器鏡像的一部分存在一些缺點(diǎn):

1.鏡像體積變大,導(dǎo)致更長(zhǎng)的下載和構(gòu)建時(shí)間。

2.額外的二進(jìn)制文件可能會(huì)引入安全漏洞。

如何解決吶?

  • 使用適合你需求的最小基礎(chǔ)鏡像 考慮一下-你是否需要一個(gè)完整的操作系統(tǒng)(包括所有額外的二進(jìn)制文件)來(lái)運(yùn)行你的程序?如果沒(méi)有,也許基于alpine鏡像或Debian的鏡像會(huì)更好。
  • 使用特定的鏡像 如果使用特定的鏡像,則已經(jīng)可以控制和預(yù)測(cè)某些行為。如果我使用maven:3.6.3-jdk-11-slim鏡像,則已經(jīng)確定我正在使用JDK 11和Maven 3.6.3。JDK和Maven的更新,將不再影響Java容器的行為。為了更加精確,你也可以使用鏡像的SHA256哈希值。使用哈希將確保你每次構(gòu)建鏡像時(shí)都使用完全相同的基礎(chǔ)鏡像。

讓我們用這些知識(shí)更新我們的Dockerfile:

  1. FROM maven:3.6.3-jdk-11-slim@sha256:68ce1cd457891f48d1e137c7d6a4493f60843e84c9e2634e3df1d3d5b381d36c 
  2. RUN mkdir /app 
  3. WORKDIR /app 
  4. COPY . /app 
  5. RUN mvn clean package -DskipTests 

2.在Java鏡像中僅安裝需要的內(nèi)容

以下命令會(huì)在容器中構(gòu)建Java程序,包括其所有依賴項(xiàng)。這意味著源代碼和構(gòu)建系統(tǒng)都將會(huì)是Java容器的一部分。

RUN mvn clean package -DskipTests

我們都知道Java是一種編譯語(yǔ)言。這意味著我們只需要由你的構(gòu)建環(huán)境創(chuàng)建的工件,而不需要代碼本身。這也意味著構(gòu)建環(huán)境不應(yīng)成為Java鏡像的一部分。

要運(yùn)行Java鏡像,我們也不需要完整的JDK。一個(gè)Java運(yùn)行時(shí)環(huán)境(JRE)就足夠了。因此,從本質(zhì)上講,如果它是可運(yùn)行的JAR,那么只需要使用JRE和已編譯的Java構(gòu)件來(lái)構(gòu)建鏡像。

使用Maven在CI流水線中都構(gòu)建編譯程序,然后將JAR復(fù)制到鏡像中,如下面的更新的Dockerfile中所示:

  1. FROM openjdk:11-jre-slim@sha256:31a5d3fa2942eea891cf954f7d07359e09cf1b1f3d35fb32fedebb1e3399fc9e 
  2.  
  3. RUN mkdir /app 
  4.  
  5. COPY ./target/java-application.jar /app/java-application.jar 
  6.  
  7. WORKDIR /app 
  8.  
  9. CMD "java" "-jar" "java-application.jar" 

3. 查找并修復(fù)Java鏡像中的安全漏洞

通過(guò)上面,我們已經(jīng)開(kāi)始使用適合我們需求的最小基礎(chǔ)鏡像了,但是,我不知道此基本鏡像中的二進(jìn)制文件是否包含問(wèn)題。讓我們使用安全工具(如 Snyk CLI)掃描測(cè)試我們的Docker鏡像。你可以在此處注冊(cè)免費(fèi)的Snyk帳戶。

使用npm,brew,scoop或從Github下載最新的二進(jìn)制文件來(lái)安裝Snyk CLI:

  1. $ npm install -g snyk 
  2.  
  3. $ snyk auth 
  4.  
  5. $ snyk container test openjdk:11-jre-slim@sha256:31a5d3fa2942eea891cf954f7d07359e09cf1b1f3d35fb32fedebb1e3399fc9e --file=Dockerfile 

使用我剛剛創(chuàng)建的免費(fèi)帳戶來(lái)登錄。使用snyk container test可以測(cè)試任何Docker鏡像。此外,我還可以添加Dockerfile以獲得更好的建議。

Snyk在此基本鏡像中發(fā)現(xiàn)了58個(gè)安全問(wèn)題。它們中的大多數(shù)與Debian Linux發(fā)行版附帶的二進(jìn)制文件有關(guān)。 根據(jù)此信息,我將基礎(chǔ)鏡像切換為由adoptopenjdk提供的
openjdk11:jre-11.0.9.1_1-alpine鏡像。

  1. FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine@sha256:b6ab039066382d39cfc843914ef1fc624aa60e2a16ede433509ccadd6d995b1f 

然后使用snyk container命令對(duì)此進(jìn)行測(cè)試時(shí),此鏡像沒(méi)有已知的漏洞。

以類(lèi)似的方式,你可以通過(guò)snyk test命令在項(xiàng)目的根目錄中測(cè)試Java應(yīng)用程序。我建議你在本地計(jì)算機(jī)上進(jìn)行開(kāi)發(fā)時(shí),請(qǐng)同時(shí)測(cè)試應(yīng)用程序和創(chuàng)建的Java容器鏡像。緊接著,對(duì)CI流水線中的鏡像和應(yīng)用程序執(zhí)行相同的測(cè)試自動(dòng)化。

另外,請(qǐng)記住,隨著時(shí)間的推移會(huì)發(fā)現(xiàn)漏洞。一旦發(fā)現(xiàn)新漏洞,你可能希望得到通知。

還有,使用snyk monitor監(jiān)視你的應(yīng)用程序,你將能夠及時(shí)發(fā)現(xiàn)新的安全問(wèn)題時(shí)采取適當(dāng)?shù)拇胧?/p>

另外,你也可以將git存儲(chǔ)庫(kù)連接到Snyk,這樣我們就可以幫助查找和補(bǔ)救漏洞。

讓我們更新當(dāng)前的Dockerfile:

  1. FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine@sha256:b6ab039066382d39cfc843914ef1fc624aa60e2a16ede433509ccadd6d995b1f 
  2.  
  3. RUN mkdir /app 
  4.  
  5. COPY ./target/java-application.jar /app/java-application.jar 
  6.  
  7. WORKDIR /usr/src/project 
  8.  
  9. CMD "java" "-jar" "java-application.jar" 

4.使用多階段構(gòu)建Java鏡像

在本文的前面,我們談到了我們不需要在容器中構(gòu)建Java應(yīng)用程序。但是,在某些情況下,將我們的應(yīng)用程序構(gòu)建為Docker鏡像的一部分很方便。

我們可以將Docker鏡像的構(gòu)建分為多個(gè)階段。我們可以使用構(gòu)建應(yīng)用程序所需的所有工具來(lái)構(gòu)建鏡像,并在最后階段創(chuàng)建實(shí)際的生產(chǎn)鏡像。

  1. FROM maven:3.6.3-jdk-11-slim@sha256:68ce1cd457891f48d1e137c7d6a4493f60843e84c9e2634e3df1d3d5b381d36c AS build 
  2.  
  3. RUN mkdir /project 
  4.  
  5. COPY . /project 
  6.  
  7. WORKDIR /project 
  8.  
  9. RUN mvn clean package -DskipTests 
  10.  
  11. FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine@sha256:b6ab039066382d39cfc843914ef1fc624aa60e2a16ede433509ccadd6d995b1f 
  12.  
  13. RUN mkdir /app 
  14.  
  15. COPY --from=build /project/target/java-application.jar /app/java-application.jar 
  16.  
  17. WORKDIR /app 
  18.  
  19. CMD "java" "-jar" "java-application.jar" 

防止敏感信息泄漏

在創(chuàng)建Java應(yīng)用程序和Docker鏡像時(shí),很有可能需要連接到私有倉(cāng)庫(kù),類(lèi)似settings.xml的配置文件經(jīng)常會(huì)泄露敏感信息。但在使用多階段構(gòu)建時(shí),你可以安全地將settings.xml復(fù)制到你的構(gòu)建容器中。帶有憑據(jù)的設(shè)置將不會(huì)出現(xiàn)在你的最終鏡像中。此外,如果是將憑據(jù)用作命令行參數(shù),則可以在構(gòu)建鏡像中安全地執(zhí)行此操作。

使用多階段構(gòu)建,你可以創(chuàng)建多個(gè)階段,僅將結(jié)果復(fù)制到最終的生產(chǎn)鏡像中。這是分離是確保在生產(chǎn)環(huán)境中不泄漏數(shù)據(jù)的一種方法。

哦,順便說(shuō)一句,使用docker history命令查看Java鏡像的輸出:

  1. $ docker history java-application 

輸出僅顯示來(lái)自容器鏡像的信息,而不顯示構(gòu)建鏡像的過(guò)程。

5.不要以Root用戶運(yùn)行容器

創(chuàng)建Docker容器時(shí),你需要應(yīng)用最小特權(quán)原則,防止由于某種原因攻擊者能夠入侵你的應(yīng)用程序,則你不希望他們能夠訪問(wèn)所有內(nèi)容。

擁有多層安全性,可以幫助你減少系統(tǒng)威脅。因此,必須確保你不以root用戶身份運(yùn)行應(yīng)用程序。

但默認(rèn)情況下,創(chuàng)建Docker容器時(shí),你將以root身份運(yùn)行它。盡管這對(duì)于開(kāi)發(fā)很方便,但是你不希望在生產(chǎn)鏡像中使用它。假設(shè)由于某種原因,攻擊者可以訪問(wèn)終端或可以執(zhí)行代碼。在那種情況下,它對(duì)正在運(yùn)行的容器具有顯著的特權(quán),并且訪問(wèn)主機(jī)文件系統(tǒng)。

解決方案非常簡(jiǎn)單。創(chuàng)建一個(gè)有限特權(quán)的特定用戶來(lái)運(yùn)行你的應(yīng)用程序,并確保該用戶可以運(yùn)行該應(yīng)用程序。最后,在運(yùn)行應(yīng)用程序之前,不要忘記使用新創(chuàng)建的用戶。

讓我們相應(yīng)地更新我們的Dockerfile。

  1. FROM maven:3.6.3-jdk-11-slim@sha256:68ce1cd457891f48d1e137c7d6a4493f60843e84c9e2634e3df1d3d5b381d36c AS build 
  2.  
  3. RUN mkdir /project 
  4.  
  5. COPY . /project 
  6.  
  7. WORKDIR /project 
  8.  
  9. RUN mvn clean package -DskipTests 
  10.  
  11. FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine@sha256:b6ab039066382d39cfc843914ef1fc624aa60e2a16ede433509ccadd6d995b1f 
  12.  
  13. RUN mkdir /app 
  14.  
  15. RUN addgroup --system javauser && adduser -S -s /bin/false -G javauser javauser 
  16.  
  17. COPY --from=build /project/target/java-application.jar /app/java-application.jar 
  18.  
  19. WORKDIR /app 
  20.  
  21. RUN chown -R javauser:javauser /app 
  22.  
  23. USER javauser 
  24.  
  25. CMD "java" "-jar" "java-application.jar" 

6.Java應(yīng)用程序不要使用PID為1的進(jìn)程

在許多示例中,我看到了使用構(gòu)建環(huán)境來(lái)啟動(dòng)容器化Java應(yīng)用程序的常見(jiàn)錯(cuò)誤。

上面,我們了解了要在 Java容器中使用Maven或Gradle的重要性,但是使用如下命令,會(huì)有不同的效果:

  • CMD “mvn” “exec:java”
  • CMD [“mvn”, “spring-boot run”]
  • CMD “gradle” “bootRun”
  • CMD “run-app.sh”

在Docker中運(yùn)行應(yīng)用程序時(shí),第一個(gè)應(yīng)用程序?qū)⒁赃M(jìn)程ID為1(PID=1)運(yùn)行。Linux內(nèi)核會(huì)以特殊方式處理PID為1的進(jìn)程。通常,進(jìn)程號(hào)為1的PID上的過(guò)程是初始化過(guò)程。如果我們使用Maven運(yùn)行Java應(yīng)用程序,那么如何確定Maven將類(lèi)似SIGTERM信號(hào)轉(zhuǎn)發(fā)給Java進(jìn)程呢?

如果像下面的示例,那樣運(yùn)行Docker容器,則Java應(yīng)用程序?qū)⒕哂蠵ID為1的進(jìn)程。

  1. CMD“ java”“-jar”“ application.jar” 

請(qǐng)注意,docker kill和docker stop命令僅向PID為1的容器進(jìn)程發(fā)送信號(hào)。例如,如果你正在運(yùn)行Java應(yīng)用的shell腳本,/bin/sh不會(huì)將信號(hào)轉(zhuǎn)發(fā)給子進(jìn)程。

更為重要的是,在Linux中,PID為1的容器進(jìn)程還有一些其他職責(zé)。在“ 《Docker和僵尸進(jìn)程問(wèn)題》”一文中對(duì)它們進(jìn)行了很好的描述。因此,在某些情況下,你不希望應(yīng)用程序成為PID為1的進(jìn)程,因?yàn)槟悴恢廊绾翁幚磉@些問(wèn)題。一個(gè)很好的解決方案是使用dumb-init。

  1. RUN apk add dumb-init 
  2.  
  3. CMD "dumb-init" "java" "-jar" "java-application.jar" 

當(dāng)你像這樣運(yùn)行Docker容器時(shí),dumb-init會(huì)占用PID為1的容器進(jìn)程并承擔(dān)所有責(zé)任。你的Java流程不再需要考慮這一點(diǎn)。

我們更新后的Dockerfile現(xiàn)在看起來(lái)像這樣:

  1. FROM maven:3.6.3-jdk-11-slim@sha256:68ce1cd457891f48d1e137c7d6a4493f60843e84c9e2634e3df1d3d5b381d36c AS build 
  2.  
  3. RUN mkdir /project 
  4.  
  5. COPY . /project 
  6.  
  7. WORKDIR /project 
  8.  
  9. RUN mvn clean package -DskipTests 
  10.  
  11. FROM adoptopenjdk/openjdk11:jre-11.0.9.1_1-alpine@sha256:b6ab039066382d39cfc843914ef1fc624aa60e2a16ede433509ccadd6d995b1f 
  12.  
  13. RUN apk add dumb-init 
  14.  
  15. RUN mkdir /app 
  16.  
  17. RUN addgroup --system javauser && adduser -S -s /bin/false -G javauser javauser 
  18.  
  19. COPY --from=build /project/target/java-code-workshop-0.0.1-SNAPSHOT.jar /app/java-application.jar 
  20.  
  21. WORKDIR /app 
  22.  
  23. RUN chown -R javauser:javauser /app 
  24.  
  25. USER javauser 
  26.  
  27. CMD "dumb-init" "java" "-jar" "java-application.jar" 

7.優(yōu)雅下線Java應(yīng)用程序

當(dāng)你的應(yīng)用程序收到關(guān)閉信號(hào)時(shí),理想情況下,我們希望所有內(nèi)容都能正常關(guān)閉。根據(jù)你開(kāi)發(fā)應(yīng)用程序的方式,中斷信號(hào)(SIGINT)或CTRL + C可能導(dǎo)致立即終止進(jìn)程。

這可能不是你想要的東西,因?yàn)橹T如此類(lèi)的事情可能會(huì)導(dǎo)致意外行為,甚至導(dǎo)致數(shù)據(jù)丟失。

當(dāng)你將應(yīng)用程序作為Payara或Apache Tomcat之類(lèi)的Web服務(wù)器的一部分運(yùn)行時(shí),該Web服務(wù)器很可能會(huì)正常關(guān)閉。對(duì)于某些支持可運(yùn)行應(yīng)用程序的框架也是如此。例如,Spring Boot具有嵌入式Tomcat版本,可以有效地處理關(guān)機(jī)問(wèn)題。

當(dāng)你創(chuàng)建一個(gè)獨(dú)立的Java應(yīng)用程序或手動(dòng)創(chuàng)建一個(gè)可運(yùn)行的JAR時(shí),你必須自己處理這些中斷信號(hào)。

解決方案非常簡(jiǎn)單。添加一個(gè)退出鉤子(hook ),如下面的示例所示。收到類(lèi)似SIGINT信號(hào)后,優(yōu)雅下線應(yīng)用程序的進(jìn)程將會(huì)被啟動(dòng)。

  1. Runtime.getRuntime().addShutdownHook(new Thread() { 
  2.    @Override 
  3.    public void run() { 
  4.        System.out.println("Inside Add Shutdown Hook"); 
  5.    } 
  6. }); 

誠(chéng)然,與Dockerfile相關(guān)的問(wèn)題相比,這是一個(gè)通用的Web應(yīng)用程序問(wèn)題,但在容器環(huán)境中更重要。

8.使用 .dockerignore文件

為了防止不必要的文件污染git存儲(chǔ)庫(kù),你可以使用.gitignore文件。

對(duì)于Docker鏡像,我們有類(lèi)似的東西-.dockerignore文件。類(lèi)似于git的忽略文件,它是為了防止Docker鏡像中出現(xiàn)不需要的文件或目錄。同時(shí),我們也不希望敏感信息泄漏到我們的Docker鏡像中。

請(qǐng)參閱以下示例的.dockerignore:

  1. .dockerignore 
  2. **/*.log 
  3. Dockerfile 
  4. .git 
  5. .gitignore 

使用.dockerignore文件的要點(diǎn)是:

  • 跳過(guò)僅用于測(cè)試目的的依賴項(xiàng)。
  • 使你免于泄露密鑰或憑據(jù)信息進(jìn)入Java Docker鏡像的文件。
  • 另外,日志文件也可能包含你不想公開(kāi)的敏感信息。
  • 保持Docker鏡像的美觀和整潔,本質(zhì)上是使鏡像變小。除此之外,它還有助于防止意外行為。

9.確保Java版本支持容器

Java虛擬機(jī)(JVM)是一件了不起的事情。它會(huì)根據(jù)其運(yùn)行的系統(tǒng)進(jìn)行自我調(diào)整。有基于行為的調(diào)整,可以動(dòng)態(tài)優(yōu)化堆的大小。但是,在Java 8和Java 9等較舊的版本中,JVM無(wú)法識(shí)別容器設(shè)置的CPU限制或內(nèi)存限制。這些較舊的Java版本的JVM看到了主機(jī)系統(tǒng)上的全部?jī)?nèi)存和所有CPU容量。Docker設(shè)置的限制將被忽略。

隨著Java 10的發(fā)布,JVM現(xiàn)在可以感知容器,并且可以識(shí)別容器設(shè)置的約束。該功能UseContainerSupport是JVM標(biāo)志,默認(rèn)情況下設(shè)置為活動(dòng)狀態(tài)。Java 10中發(fā)布的容器感知功能也已移植到Java-8u191。

對(duì)于Java 8之前的版本,你可以手動(dòng)嘗試使用該-Xmx標(biāo)志來(lái)限制堆大小,但這是一個(gè)痛苦的練習(xí)。緊接著,堆大小不等于Java使用的內(nèi)存。對(duì)于Java-8u131和Java 9,容器感知功能是實(shí)驗(yàn)性的,你必須主動(dòng)激活。

-XX:+ UnlockExperimentalVMOptions -XX:+ UseCGroupMemoryLimitForHeap

最好的選擇是將Java更新到10以上的版本,以便默認(rèn)情況下支持容器。不幸的是,許多公司仍然嚴(yán)重依賴Java8。這意味著你應(yīng)該在Docker鏡像中更新到Java的最新版本,或者確保至少使用Java 8 update 191或更高版本。

10.謹(jǐn)慎使用容器自動(dòng)化生成工具

你可能會(huì)偶然發(fā)現(xiàn)適用于構(gòu)建系統(tǒng)的出色工具和插件。除了這些插件,還有一些很棒的工具可以幫助你創(chuàng)建Java容器,甚至可以根據(jù)需要自動(dòng)發(fā)布應(yīng)用。

從開(kāi)發(fā)人員的角度來(lái)看,這看起來(lái)很棒,因?yàn)槟悴槐卦趧?chuàng)建實(shí)際應(yīng)用程序時(shí),還要花費(fèi)精力維護(hù)Dockerfile。

這樣的插件的一個(gè)例子是JIB。如下所示,我只需要調(diào)用mvn jib:dockerBuild命令可以構(gòu)建鏡像

  1. <plugin> 
  2.    <groupId>com.google.cloud.tools</groupId> 
  3.    <artifactId>jib-maven-plugin</artifactId> 
  4.    <version>2.7.1</version> 
  5.    <configuration> 
  6.        <to> 
  7.            <image>myimage</image> 
  8.        </to> 
  9.    </configuration> 
  10. </plugin> 

它將為我構(gòu)建一個(gè)具有指定名稱(chēng)的Docker鏡像,而沒(méi)有任何麻煩。

使用2.3及更高版本時(shí),可以通過(guò)調(diào)用mvn命令進(jìn)行操作:

  1. mvn spring-boot:build-image 

在種情況下,系統(tǒng)都會(huì)自動(dòng)為我創(chuàng)建一個(gè)Java鏡像。這些鏡像還比較小,那是因?yàn)樗麄冋谑褂梅前l(fā)行版鏡像或buildpack作為鏡像的基礎(chǔ)。但是,無(wú)論鏡像大小如何,你如何知道這些容器是安全的?你需要進(jìn)行更深入的調(diào)查,即使這樣,你也不確定將來(lái)是否會(huì)保持這種狀態(tài)。

我并不是說(shuō)你在創(chuàng)建Java Docker時(shí)不應(yīng)使用這些工具。但是,如果你打算發(fā)布這些鏡像,則應(yīng)研究Java鏡像所有方面的安全。鏡像掃描將是一個(gè)好的開(kāi)始。從安全性的角度來(lái)看,我的觀點(diǎn)是,以完全控制和正確的方式創(chuàng)建Dockerfile,是創(chuàng)建鏡像更好,更安全的方式。

 

責(zé)任編輯:張燕妮 來(lái)源: 今日頭條
相關(guān)推薦

2019-11-05 17:10:19

Java開(kāi)發(fā)編程語(yǔ)言

2020-10-27 06:56:53

IoT產(chǎn)品實(shí)踐

2019-11-20 10:32:39

云計(jì)算安全技術(shù)

2022-05-13 14:28:03

云原生權(quán)限云原生

2020-04-27 10:20:07

微服務(wù)架構(gòu)數(shù)據(jù)庫(kù)

2020-04-23 10:35:10

Docker鏡像實(shí)踐

2019-12-16 12:11:53

Docker容器Kubernetes

2023-03-30 08:00:00

ReactJavaScript前端

2020-11-23 18:39:54

容器Kubernetes架構(gòu)

2020-03-24 14:45:17

程序員技能開(kāi)發(fā)者

2019-12-16 17:59:22

軟件微服務(wù)技術(shù)

2019-12-17 08:07:58

微服務(wù)架構(gòu)

2022-10-09 08:08:02

人工智能機(jī)器學(xué)習(xí)平臺(tái)

2020-07-24 10:36:17

云計(jì)算云平臺(tái)數(shù)據(jù)

2021-02-25 09:00:00

架構(gòu)開(kāi)發(fā)運(yùn)維

2021-06-25 14:50:21

DevSecOps安全 DevOps

2022-10-10 14:53:00

云安全云計(jì)算云平臺(tái)

2020-11-24 10:32:16

CIO首席信息官工具

2021-03-01 19:24:13

Kubernetes備份容器

2022-02-28 15:56:14

零信任企業(yè)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)