个人项目部署 Docker 时,为避免每次升级都重新构建一个新容器,可以参考本文方式构建一个通用的 Java 运行镜像。
构建通用镜像
本文以 Java 21 JRE 为例。使用 eclipse-temurin:21-jre 作为基础镜像
Dockerfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
FROM eclipse-temurin:21-jre
LABEL maintainer="tofuwine@tofuwine.cn"
ENV TZ=Asia/Shanghai
WORKDIR /app
EXPOSE 8080
RUN echo '#!/bin/sh' > /entrypoint.sh \
&& echo 'if [ -n "$JAR_NAME" ]; then' >> /entrypoint.sh \
&& echo ' JAR_FILE="/app/$JAR_NAME"' >> /entrypoint.sh \
&& echo 'else' >> /entrypoint.sh \
&& echo ' JAR_FILE=$(ls /app/*.jar 2>/dev/null | head -1)' >> /entrypoint.sh \
&& echo 'fi' >> /entrypoint.sh \
&& echo 'if [ ! -f "$JAR_FILE" ]; then echo "ERROR jar $JAR_FILE not exists"; exit 1; fi' >> /entrypoint.sh \
&& echo 'echo "Starting jar: $JAR_FILE"' >> /entrypoint.sh \
&& echo 'exec java ${JAVA_OPTS} -jar "$JAR_FILE"' >> /entrypoint.sh \
&& chmod +x /entrypoint.sh
ENV JAVA_OPTS="-Xms256m -Xmx512m"
ENTRYPOINT ["/entrypoint.sh"]
|
配置说明:
- 基础镜像
21-jre:如需其他版本可替换。例如:21-jdk 等
- 暴露端口为
8080。注意 Java 程序,如 Spring Boot 需配置端口为 8080,或修改暴露端口
构建指令
在 Dockerfile 所在目录执行如下指令:
1
|
docker buildx build --no-cache --output type=docker,dest=generic-java-run.tar -t tofuwine/generic-java-run:21-jre .
|
指令说明:
- 指令最后一个
. 别落下。
--no-cache 禁用缓存,可忽略
--output type=docker,dest=generic-java-run.tar 输出为 tar 文件,可以方便导入到其他地方(如 Nas Docker 等)
使用说明
参考如下 docker-compose.yml 部署 Java 程序:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
version: '3.9'
services:
myapp:
image: tofuwine/generic-java-run:21-jre
container_name: myapp
hostname: myapp
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- /docker/myapp:/app
environment:
# JAR_NAME: myapp.jar # 当多个 jar 文件时,可指定 jar 文件名。如果只有一个 jar 文件,可忽略此参数。
JAVA_OPTS: >-
-Xms512m
-Xmx1024m
-XX:+UseG1GC
-XX:+HeapDumpOnOutOfMemoryError
-Dspring.profiles.active=prod
|
打包内容全部放到 /docker/myapp 目录下,即可启动。后续只需要替换该目录内容即可。