启动微服务,查看日志在初始化数据源卡死,过几分钟之后,报:
Caused by: java.sql.SQLRecoverableException: IO 错误: Connection reset
……
Caused by: java.net.SocketException: Connection reset
网上查找原因,给出的解决方法是,增加启动参数:
-Djava.security.egd=file:/dev/urandom
查看了一下程序启动参数已经添加了。后来Dockerfile构建镜像时,将ENTRYPOINT的格式由exec格式换成了shell格式,其他各种参数不变。问题竟然解决了。其实,这两种方式应该没有差别才对啊。太诡异了。
ENTRYPOINT ["java","-Djava.awt.headless=true -XX:+UseConcMarkSweepGC -Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
修改为:
ENV JAVA_OPTS="-Djava.awt.headless=true -XX:+UseConcMarkSweepGC"
ENTRYPOINT ["/bin/sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
启动容器之后,查看容器执行的命令:
exec格式:
java '-Djava.awt.headless=true -XX:+UseConcMarkSweepGC -Djava.security.egd=file:/dev/./urandom' -jar /app.jar
shell格式:
sh -c 'java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar'