Podman 教程

Containerfile 实战:自己的 Spring Boot 镜像(基于 jar)

以下是一个部署 Spring Boot 应用的 Containerfile 示例,通过已经打包编译好的 app.jar 进行镜像构建,避免在构建镜像的过程中编译项目和打包,并且暴露 8080 端口。

目录结构

将 Containerfile 和 Spring Boot 打包好的 app.jar 放在同一目录,目录结构如下图:

Containerfile 实战:自己的 Spring Boot 镜像(基于 jar)

spring-app/
  ├── Containerfile
  └── app.jar

  

准备 jar 文件

访问 https://start.spring.io/ 地址,快速创建一个 Spring Boot 项目,如下图:

Containerfile 实战:自己的 Spring Boot 镜像(基于 jar)

修改端口为 8080,如下:

server:
  port: 8080

spring:
  application:
    name: my_app

编写一个接口,返回“Hello Podman”字符串,如下:

package com.hxstrive.my_app;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class MyAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(MyAppApplication.class, args);
    }

    @GetMapping("/")
    public String index() {
        return "Hello Podman.";
    }

}

执行 mvn package -Dmaven.test.skip=true 打包(你也可以使用 IDEA 生成 jar),生成 jar 文件,如下图:

Containerfile 实战:自己的 Spring Boot 镜像(基于 jar)

点击下载项目源码:my_app.zip

  

Containerfile 内容

下面是 Containerfile 的内容:

# 运行阶段(使用轻量基础镜像)
FROM eclipse-temurin:17-jre-alpine

# 创建非 root 用户和组(安全最佳实践,避免容器内使用 root)
RUN addgroup -S appgroup && adduser -S appuser -G appgroup

# 设置工作目录
WORKDIR /app

# 复制当前目录的 app.jar 到容器工作目录
COPY app.jar .

# 赋予非 root 用户权限
RUN chown -R appuser:appgroup /app

# 切换到非 root 用户
USER appuser

# 暴露 Spring Boot 默认端口(与应用配置一致)
EXPOSE 8080

# 启动命令
ENTRYPOINT ["java", "-jar", "app.jar"]

部分说明:

  • 使用 eclipse-temurin:17-jre-alpine作为基础镜像,基于 Alpine 系统(轻量,镜像体积小),包含 OpenJDK 17 JRE(仅运行环境,减少冗余)。

  • 通过 addgroup 和 adduser 创建专用用户 appuser,并切换到该用户运行应用,避免容器内使用 root 权限带来的安全风险。

  • 使用 ENTRYPOINT 而非 CMD,确保容器启动时固定执行 java -jar app.jar,如需传递额外参数(如 JVM 配置),可在运行时添加:

podman run -p 8080:8080 my-spring-app:v1 -Xms512m -Xmx1g

可选优化

如果需要自定义 JVM 参数,可在 ENTRYPOINT 中添加,例如:

ENTRYPOINT ["java", "-Xms512m", "-Xmx1g", "-jar", "app.jar"]

如果应用需要读取外部配置文件,可通过 -v 挂载配置目录:

podman run -p 8080:8080 -v ./config:/app/config my-spring-app:v1

  

构建镜像

进入 spring-app 目录执行构建命令:

podman build -t my-spring-app:v1 .

构建详细日志:

C:\Users\hxstri\spring-app> podman build -t my-spring-app:v1 .
STEP 1/8: FROM eclipse-temurin:17-jre-alpine
STEP 2/8: RUN addgroup -S appgroup && adduser -S appuser -G appgroup
--> a015b0020574
STEP 3/8: WORKDIR /app
--> 5f44a94a7ab0
STEP 4/8: COPY app.jar .
--> 375f84f29a46
STEP 5/8: RUN chown -R appuser:appgroup /app
--> eb0b04b29ea5
STEP 6/8: USER appuser
--> 92a845b2967a
STEP 7/8: EXPOSE 8080
--> fbf713585253
STEP 8/8: ENTRYPOINT ["java", "-jar", "app.jar"]
COMMIT my-spring-app:v1
--> d7026ebb69e9
Successfully tagged localhost/my-spring-app:v1
d7026ebb69e93146eeab9e2222ce8bdaaa281167746f818eca664b183c5d7b1f

使用 podman images 命令查看刚刚构建的镜像:

C:\Users\hxstri\spring-app> podman images | findstr my-spring-app
localhost/my-spring-app                v1             d7026ebb69e9  55 seconds ago     224 MB

  

运行容器

运行 podman run 命令运行容器,将宿主机 8080 端口映射到容器 8080 端口,如下:

podman run -d -p 8080:8080 --name my-spring-container my-spring-app:v1

运行日志如下:

C:\Users\hxstri\spring-app> podman run -d -p 8080:8080 --name my-spring-container my-spring-app:v1
7b668b7ca43fa47147a5a12b3e14a1b9e9382754b950993cf020689dd1ae3423

C:\Users\hxstri\spring-app> podman ps
CONTAINER ID  IMAGE                       COMMAND     CREATED         STATUS         PORTS                   NAMES
7b668b7ca43f  localhost/my-spring-app:v1              23 seconds ago  Up 24 seconds  0.0.0.0:8080->8080/tcp  my-spring-container

验证

使用浏览器访问 http://localhost:8080 地址,查看应用是否正常启动。如下图:

Containerfile 实战:自己的 Spring Boot 镜像(基于 jar)

到这里镜像就构建完成了。

  

说说我的看法
全部评论(
没有评论
关于
本网站专注于 Java、数据库(MySQL、Oracle)、Linux、软件架构及大数据等多领域技术知识分享。涵盖丰富的原创与精选技术文章,助力技术传播与交流。无论是技术新手渴望入门,还是资深开发者寻求进阶,这里都能为您提供深度见解与实用经验,让复杂编码变得轻松易懂,携手共赴技术提升新高度。如有侵权,请来信告知:hxstrive@outlook.com
其他应用
公众号