Docker容器退出码异常:Java Spring Batch在AWS Batch中进程非零但容器退0
问题解决方法
问题出在你的entrypoint.sh里将Java进程放到后台运行,并且额外添加了wait命令,导致容器的主进程是shell而非Java进程,shell的退出码没有正确继承Java进程的退出码。
修改后的entrypoint.sh
exec java -Dsun.net.inetaddr.negative.ttl=0 \ -jar "jarname.jar" \ --server.ssl.key-alias=$JKS_KEY_ALIAS \ --server.ssl.key-store-password=$JKS_KEYSTORE_PASSWORD \ --server.ssl.key-password=$JKS_KEYSTORE_KEY_PASSWORD \ --server.ssl.key-store=$JKS_FILE \ --server.ssl.key-store-type=jks
关键修改点说明
- 去掉了命令末尾的
&:不再将Java进程放到后台运行,让它成为容器的主进程(PID 1) - 删除了
wait命令:无需等待后台进程,因为Java进程就是当前shell进程被exec替换后的主进程
原理解释
Docker容器的退出码完全由容器内的PID 1进程的退出码决定。原来的写法中,Java进程被放到后台,shell进程成为PID 1,执行wait后shell的退出码可能没有正确传递Java的非零退出码(或因bash特性导致返回0)。而使用exec java ...会直接让Java进程替换当前shell进程,成为PID 1,此时Java进程的任何退出码都会被Docker容器直接继承,AWS Batch就能正确识别任务的失败状态。
验证方法
你可以本地测试修改后的镜像:
- 构建镜像:
docker build -t batch-test . - 运行容器并故意让Java进程返回非零码:
docker run --rm batch-test - 查看容器退出码:
echo $?,此时应该得到Java进程返回的非零值
内容的提问来源于stack exchange,提问作者Ankit Gautam
相关产品推荐
相关产品推荐

