Spring Boot项目创建Docker镜像

项目打包

./mvnw package
./gradlew build

项目可执行测试

java -jar build/libs/${你的jar}.jar

自定义构建文件名称

bootJar {
    archiveFileName = "${archiveBaseName.get()}.${archiveExtension.get()}"
}

Dockerfile定义

Dockerfile 一般放在项目根目录,因此就以项目根目录作为docker镜像的工作空间。

FROM openjdk:8-jdk-alpine
EXPOSE 8080

RUN adduser -S admin -G root

ARG APPNAME
ENV APPNAME=${APPNAME}

# 使用镜像加速,参考http://mirrors.ustc.edu.cn/help/alpine.html
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g' /etc/apk/repositories && \
    apk add --update curl && \
    apk add gcompat && \
    rm -rf /var/cache/apk/*

# issue https://github.com/grpc/grpc-java/issues/8751 & https://github.com/netty/netty/issues/11701
ENV LD_PRELOAD=/lib/libgcompat.so.0

USER admin:root
COPY starter/build/libs/${APPNAME}.jar /home/admin/${APPNAME}.jar

WORKDIR /home/admin
ENTRYPOINT java -jar /home/admin/${APPNAME}.jar

Dockerfile构建镜像

docker build --build-arg APPNAME=demo -t wnow20/demo .

日志挂载

可以在项目中的日志配置中设置日志输出路径,本文用的是backlog,backlog配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>

    <property name="LOGS" value="${user.home}/logs" />

    <appender name="Console"
              class="ch.qos.logback.core.ConsoleAppender">
        <layout class="ch.qos.logback.classic.PatternLayout">
            <Pattern>
                %black(%d{ISO8601}) %highlight(%-5level) [%blue(%t)] %yellow(%C{1.}): %msg%n%throwable
            </Pattern>
        </layout>
    </appender>

    <appender name="RollingFile"
              class="ch.qos.logback.core.rolling.RollingFileAppender">
        <file>${LOGS}/spring-boot-logger.log</file>
        <encoder
                class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
            <Pattern>%d %p %C{1.} [%t] %m%n</Pattern>
        </encoder>

        <rollingPolicy
                class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <!-- rollover daily and when the file reaches 10 MegaBytes -->
            <fileNamePattern>${LOGS}/archived/spring-boot-logger-%d{yyyy-MM-dd}.%i.log
            </fileNamePattern>
            <timeBasedFileNamingAndTriggeringPolicy
                    class="ch.qos.logback.core.rolling.SizeAndTimeBasedFNATP">
                <maxFileSize>10MB</maxFileSize>
            </timeBasedFileNamingAndTriggeringPolicy>
        </rollingPolicy>
    </appender>

    <!-- LOG everything at INFO level -->
    <root level="info">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </root>

    <!-- LOG "com.baeldung*" at TRACE level -->
    <logger name="com.example" level="trace" additivity="false">
        <appender-ref ref="RollingFile" />
        <appender-ref ref="Console" />
    </logger>

</configuration>

另外docker容器还可以挂载盘符,例子如下:

version: '3.9'

services:
  demo:
    image: wnow20/demo:v1
    volumes:
      - /Users/ge/docker-files/demo/logs:/home/admin/logs
    environment:
      - SPRING_PROFILES_ACTIVE=production
    ports:
      - 8080:8080
      - 8082:8082
    healthcheck:
      test: "curl --fail --silent http://127.0.0.1:8082/actuator/health | grep UP || exit 1"
      interval: 1s
      timeout: 5s
      retries: 3
      start_period: 5s

docker-compose.yml中,我们给服务增加健康检查,当且仅当服务可用时才对外提供服务。

部署

docker stack deploy -c docker-compose.yml demo

源码链接:https://github.com/wnow20/spring-boot-with-dockeropen in new window


Last Updated:
Contributors: wnow20