FROM anapsix/alpine-java:8_server-jre_unlimited
# 下面是JDK17镜像
# FROM bellsoft/liberica-openjdk-debian:17.0.11-cds
MAINTAINER xxx作者
#定义参数(build构建时使用)
ARG VERSION
ARG SERVICE_NAME
ARG SERVICE_PORT
# 系统编码
#设置环境变量(程序运行时使用)
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8
ENV JAVA_OPTS=""
ENV PARAMS="--spring.profiles.active=prod"
ENV VERSION=$VERSION
ENV SERVICE_NAME=$SERVICE_NAME
ENV SERVICE_PORT=$SERVICE_PORT
#工作目录
WORKDIR /usr/local/
# 声明一个挂载点,容器内此路径会对应宿主机的某个文件夹
VOLUME ["/usr/local/logs"]
# 应用构建成功后的jar文件被复制到镜像内,名字也改成了app.jar
ADD ./target/${SERVICE_NAME}-${VERSION}.jar app.jar
# 声明运行时端口
EXPOSE ${SERVICE_PORT}
# 健康检查参数设置,每5秒检查一次,接口超时时间2秒,连续10次返回1就判定该容器不健康
HEALTHCHECK --interval=5s \
--timeout=3s \
--retries=10 \
CMD curl -fs http://localhost:${SERVICE_PORT}/actuator/health || exit 1
# 启动容器时的进程
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar app.jar $PARAMS"]
构建命令
docker build --build-arg VERSION=1.0.0 SERVICE_NAME=MyApp SERVICE_PORT=8080 -t my-springboot-app .
启动命令
docker run -d -p 8080:8080 --name my-springboot-container my-springboot-app
-Djava.security.egd=file:/dev/./urandom参数说明
在 Docker 容器中运行 Java 应用时,你可能会遇到由于熵池不足导致的 SSL/TLS 握手延迟问题。这是因为 Java 默认使用 /dev/random
作为其安全随机数生成器(SecureRandom)的来源,而 /dev/random
在熵池耗尽时会阻塞等待更多的熵输入,这在某些情况下(特别是容器化环境中)可能导致显著的性能瓶颈。为了缓解这个问题,可以通过设置 JVM 参数 security.egd
来指定使用 /dev/urandom
作为熵源。/dev/urandom
不会因为熵池不足而阻塞,因此可以提高应用启动速度和响应时间