全部产品
云市场

制作 SOFABoot 应用的 Docker 镜像

更新时间:2019-12-16 21:20:56

在将应用工程打包成 Docker 镜像的方法上,SOFABoot 完全与 SpringBoot 一致。本篇将基于 SpringBoot 官方提供的文档教您如何将一个 SOFABoot 的示例应用工程制作成 Docker镜像。

前提条件

在运行示例工程之前请先安装 Docker 环境,具体操作请参见 Docker 官方文档

注意:在后面打包过程中,如果是 Mac OS ,会出现连接问题,解决方案请参见 Docker 在 Mac 下的 2375 端口问题

操作步骤

本教程将教您如何使用 Dockerfile 将一个 SOFABoot 示例应用的 JAR 包打包成镜像。

编写 Dockerfile 文件

Docker 提供了 Dockerfile 格式的文件来构建应用镜像,现在开始创建一个 Spring Boot 应用的 Dockerfile:

  1. FROM openjdk:8-jdk-alpine
  2. VOLUME /tmp
  3. // 应用 JAR 包的名称必须遵循 artifactId-version 的格式
  4. COPY sofaboot-docker-demo-web-1.0.0.jar /app.jar
  5. ENV JAVA_OPTS=""
  6. ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]

java:8 是指 Docker Hub上官方提供的 Java 镜像,版本号是 8,也就是 JDK 1.8。有了这个基础镜像后,Dockerfile 可以通过 FROM 指令直接获取它的状态——也就是在容器中,Java是已经安装的。接下来,通过自定义的命令来运行 Spring Boot 应用:

  • VOLUME /tmp创建 /tmp 目录并持久化到Docker数据文件夹,因为 Spring Boot 使用的内嵌 Tomcat 容器默认使用 /tmp 作为工作目录。
  • COPY sofaboot-docker-demo-web-1.0.0.jar /app.jar 将应用 JAR 包复制到/app.jar
  • ENTRYPOINT 表示容器运行后默认执行的命令。

配置 Maven 打包插件

在 app/web 模块的 pom 文件中添加 docker maven 的打包插件:

说明:仔细检查本地镜像打包配置,如发现存在 outputDirectoryclassifier 配置,需注释掉或移除该配置。

  1. <!-- Docker maven plugin -->
  2. <plugin>
  3. <groupId>com.spotify</groupId>
  4. <artifactId>docker-maven-plugin</artifactId>
  5. <version>0.4.13</version>
  6. <configuration>
  7. <imageName>${project.groupId}/${project.artifactId}:${project.version}</imageName>
  8. <!-- Dockerfiler 的文件目录位置-->
  9. <dockerDirectory>src/main/resources/docker</dockerDirectory>
  10. <resources>
  11. <resource>
  12. <targetPath>/</targetPath>
  13. <directory>${project.build.directory}</directory>
  14. <include>${project.build.finalName}.jar</include>
  15. </resource>
  16. </resources>
  17. </configuration>
  18. </plugin>

打包

  1. 在工程模块下执行 mvn clean install -DskipTests,安装模块。

  2. 切换到 web 模块,打包镜像:

    1. - cd app/web
    2. - mvn package docker:build -Dmaven.test.skip

    打包日志如下所示:

    1. Step 1/6 : FROM openjdk:8-jdk-alpine
    2. ---> 3675b9f543c5
    3. Step 2/6 : VOLUME /tmp
    4. ---> Using cache
    5. ---> c7a81ace946a
    6. Step 3/6 : COPY sofaboot-docker-demo-web-1.0.0.jar app.jar
    7. ---> f24e191bc980
    8. Step 4/6 : RUN sh -c 'touch /app.jar'
    9. ---> Running in 777a918b3314
    10. Removing intermediate container 777a918b3314
    11. ---> 183a3067e911
    12. Step 5/6 : ENV JAVA_OPTS=""
    13. ---> Running in 70c238ef5b5b
    14. Removing intermediate container 70c238ef5b5b
    15. ---> a155e72ed7fc
    16. Step 6/6 : ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
    17. ---> Running in c53eaccaf58f
    18. Removing intermediate container c53eaccaf58f
    19. ---> 57bb9c53cfe6
    20. ProgressMessage{id=null, status=null, stream=null, error=null, progress=null, progressDetail=null}
    21. Successfully built 57bb9c53cfe6
    22. Successfully tagged com.alipay.sofa/sofaboot-docker-demo-web:1.0.0
  3. 通过 docker images 命令查看当前镜像文件:

    1. - docker images

    显示结果:

    1. REPOSITORY TAG IMAGE ID CREATED SIZE
    2. com.alipay.sofa/sofaboot-docker-demo-web 1.0.0 57bb9c53cfe6 About a minute ago 105MB