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

spring-app/ ├── Containerfile └── app.jar
访问 https://start.spring.io/ 地址,快速创建一个 Spring Boot 项目,如下图:

修改端口为 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 文件,如下图:

点击下载项目源码:
my_app.zip
下面是 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 地址,查看应用是否正常启动。如下图:

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