本文目录导读:

我来为您详细介绍如何使用Dockerfile构建Java应用的镜像。
基础Dockerfile示例
简单Spring Boot应用
# 基础镜像 FROM openjdk:17-jdk-slim # 维护者信息 LABEL maintainer="your-email@example.com" # 设置工作目录 WORKDIR /app # 复制jar包到容器中 COPY target/application.jar app.jar # 暴露端口 EXPOSE 8080 # 启动命令 ENTRYPOINT ["java", "-jar", "app.jar"]
多阶段构建(推荐)
# 第一阶段:构建阶段 FROM maven:3.8.4-openjdk-17-slim AS builder WORKDIR /build # 复制pom文件并下载依赖(利用缓存) COPY pom.xml . RUN mvn dependency:go-offline -B # 复制源代码并构建 COPY src ./src RUN mvn clean package -DskipTests # 第二阶段:运行阶段 FROM openjdk:17-jdk-slim WORKDIR /app # 从构建阶段复制jar包 COPY --from=builder /build/target/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
优化版Dockerfile
# 使用Alpine版本减小体积
FROM openjdk:17-jdk-alpine
# 设置时区
RUN apk add --no-cache tzdata && \
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
echo "Asia/Shanghai" > /etc/timezone
# 创建非root用户
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
WORKDIR /app
# 复制应用
COPY target/application.jar app.jar
# 设置JVM参数
ENV JAVA_OPTS="-Xmx256m -Xms256m"
# 切换到非root用户
USER appuser
EXPOSE 8080
# 使用exec格式启动
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar app.jar"]
Gradle项目的Dockerfile
# 构建阶段 FROM gradle:7.6-jdk17 AS builder WORKDIR /build # 先复制构建配置 COPY build.gradle settings.gradle ./ COPY gradle ./gradle # 下载依赖 RUN gradle dependencies --no-daemon # 复制源代码并构建 COPY src ./src RUN gradle bootJar --no-daemon # 运行阶段 FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=builder /build/build/libs/*.jar app.jar EXPOSE 8080 ENTRYPOINT ["java", "-jar", "app.jar"]
配置文件与日志
FROM openjdk:17-jdk-slim
WORKDIR /app
# 复制配置文件
COPY src/main/resources/application.yml ./
COPY target/*.jar app.jar
# 创建日志目录
RUN mkdir -p /var/log/app && \
chmod 755 /var/log/app
# 设置环境变量
ENV SPRING_PROFILES_ACTIVE=prod
ENV LOG_PATH=/var/log/app
VOLUME ["/var/log/app"]
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=60s --retries=3 \
CMD curl -f http://localhost:8080/actuator/health || exit 1
ENTRYPOINT ["java", "-jar", "app.jar"]
构建与运行命令
# 构建镜像 docker build -t myapp:1.0 . # 多阶段构建 docker build --target builder -t myapp:build . # 运行容器 docker run -d \ --name myapp \ -p 8080:8080 \ -e SPRING_PROFILES_ACTIVE=prod \ -v /path/to/logs:/var/log/app \ myapp:1.0
Docker Compose集成
# docker-compose.yml
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
ports:
- "8080:8080"
environment:
- SPRING_PROFILES_ACTIVE=docker
- DB_HOST=mysql
depends_on:
- mysql
volumes:
- app-logs:/var/log/app
networks:
- app-network
mysql:
image: mysql:8.0
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=appdb
volumes:
- mysql-data:/var/lib/mysql
networks:
- app-network
volumes:
app-logs:
mysql-data:
networks:
app-network:
driver: bridge
最佳实践
.dockerignore文件
# .dockerignore .git .gitignore node_modules target *.log .idea *.iml docker-compose.yml
优化建议
- 利用镜像缓存:将不频繁变化的文件先复制
- 最小化层数:合理合并RUN命令
- 使用多阶段构建:减小最终镜像体积
- 使用特定标签:避免使用latest标签
- 安全考虑:不要以root用户运行
这样构建的Java镜像既高效又安全,适合在生产环境使用。