制作 SOFABoot 應(yīng)用的 Docker 鏡像
在將應(yīng)用工程打包成 Docker 鏡像的方法上,SOFABoot 完全與 SpringBoot 一致。本篇將基于 SpringBoot 官方提供的文檔介紹如何將一個(gè) SOFABoot 的示例應(yīng)用工程制作成 Docker 鏡像。
前提條件
在運(yùn)行示例工程之前請(qǐng)先安裝 Docker 環(huán)境,具體操作請(qǐng)參見(jiàn) Docker 官方文檔。
在打包過(guò)程中,如果是 Mac OS,會(huì)出現(xiàn)連接問(wèn)題,解決方案請(qǐng)參見(jiàn) Docker 在 Mac 下的 2375 端口問(wèn)題 。
操作步驟
本教程介紹如何使用 Dockerfile 將一個(gè) SOFABoot 示例應(yīng)用的 JAR 包打包成鏡像。
編寫(xiě) Dockerfile 文件
Docker 提供了 Dockerfile 格式的文件來(lái)構(gòu)建應(yīng)用鏡像,創(chuàng)建一個(gè) Spring Boot 應(yīng)用的 Dockerfile:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
// 應(yīng)用 JAR 包的名稱必須遵循 artifactId-version 的格式
COPY sofaboot-docker-demo-web-1.0.0.jar /app.jar
ENV JAVA_OPTS=""
#商業(yè)版 SOFAStack 中間件需要輸入四元組進(jìn)行服務(wù)端注冊(cè)鑒權(quán),可以按照以下約定,在進(jìn)行容器化發(fā)布時(shí)以環(huán)境變量方式注入。詳情請(qǐng)參見(jiàn)服務(wù)網(wǎng)格的快速入門(mén)文檔。
# COM_ALIPAY_ENV=shared
# ENV COM_ALIPAY_INSTANCEID=
# ENV COM_ANTCLOUD_ANTVIP_ENDPOINT=
# ENV COM_ANTCLOUD_MW_ACCESS=
# ENV COM_ANTCLOUD_MW_SECRET=
ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"]
java:8
是指 Docker Hub上官方提供的 Java 鏡像,版本號(hào)是 8,也就是 JDK 1.8。有了這個(gè)基礎(chǔ)鏡像后,Dockerfile 可以通過(guò) FROM
指令直接獲取它的狀態(tài)——也就是在容器中,Java是已經(jīng)安裝的。接下來(lái),通過(guò)自定義的命令來(lái)運(yùn)行 Spring Boot 應(yīng)用:
VOLUME /tmp
創(chuàng)建 /tmp 目錄并持久化到Docker數(shù)據(jù)文件夾,因?yàn)?Spring Boot 使用的內(nèi)嵌 Tomcat 容器默認(rèn)使用 /tmp 作為工作目錄。COPY sofaboot-docker-demo-web-1.0.0.jar /app.jar
將應(yīng)用 JAR 包復(fù)制到/app.jar
。ENTRYPOINT
表示容器運(yùn)行后默認(rèn)執(zhí)行的命令。
配置 Maven 打包插件
在 app/web 模塊的 pom 文件中添加 docker maven 的打包插件:
仔細(xì)檢查本地鏡像打包配置,如發(fā)現(xiàn)存在 outputDirectory 和 classifier 配置,需注釋掉或移除該配置。
<!--Docker maven plugin -->
<plugin>
<groupId>com.spotify</groupId>
<artifactId>docker-maven-plugin</artifactId>
<version>0.4.13</version>
<configuration>
<imageName>${project.groupId}/${project.artifactId}:${project.version}</imageName>
<!--Dockerfiler的文件目錄位置-->
<dockerDirectory>src/main/resources/docker</dockerDirectory>
<resources>
<resource>
<targetPath>/</targetPath>
<directory>${project.build.directory}</directory>
<include>${project.build.finalName}.jar</include>
</resource>
</resources>
</configuration>
</plugin>
打包
在工程模塊下執(zhí)行
mvn clean install -DskipTests
,安裝模塊。切換到 Web 模塊,打包鏡像:
- cd app/web - mvn package docker:build -Dmaven.test.skip
打包日志如下所示:
Step1/6: FROM openjdk:8-jdk-alpine --->3675b9f543c5 Step2/6: VOLUME /tmp --->Using cache ---> c7a81ace946a Step3/6: COPY sofaboot-docker-demo-web-1.0.0.jar app.jar ---> f24e191bc980 Step4/6: RUN sh -c 'touch /app.jar' --->Running in 777a918b3314 Removing intermediate container 777a918b3314 --->183a3067e911 Step5/6: ENV JAVA_OPTS="" --->Running in 70c238ef5b5b Removing intermediate container 70c238ef5b5b ---> a155e72ed7fc Step6/6: ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar"] --->Running in c53eaccaf58f Removing intermediate container c53eaccaf58f --->57bb9c53cfe6 ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null} Successfully built 57bb9c53cfe6 Successfully tagged com.alipay.sofa/sofaboot-docker-demo-web:1.0.0
通過(guò)
docker images
命令查看當(dāng)前鏡像文件:- docker images
顯示結(jié)果:
REPOSITORY TAG IMAGE ID CREATED SIZE com.alipay.sofa/sofaboot-docker-demo-web 1.0.057bb9c53cfe6About a minute ago 105MB