使用Docker ENTRYPOINT shell形式时,如何为Spring Boot应用传递参数?
Docker Shell形式ENTRYPOINT传递参数到Spring Boot应用
当Docker镜像使用exec形式的ENTRYPOINT配置Spring Boot微服务时:
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
执行docker run --rm my_image:1.0.0 --spring.profiles.active=local启动容器,--spring.profiles.active=local参数能正常被应用接收。
但改用shell形式的ENTRYPOINT配置时:
ENTRYPOINT java org.springframework.boot.loader.JarLauncher
上述启动参数会被忽略——原因确实如你推测,shell形式的ENTRYPOINT默认通过/bin/sh -c执行命令,传递的参数会被交给shell进程而非目标应用。
以下是几种解决方法:
- 推荐:改用exec形式ENTRYPOINT
这是Docker官方推荐的最佳实践,不仅能让Spring Boot应用成为容器的PID 1进程(保证信号能正确传递),还能直接接收docker run命令追加的参数:
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]
启动命令保持不变即可。
- 保留shell形式,显式传递参数
如果因特殊需求必须使用shell形式,可在ENTRYPOINT中用$@捕获所有命令行参数,同时用exec让应用接管PID 1:
ENTRYPOINT exec java org.springframework.boot.loader.JarLauncher "$@"
此时执行docker run --rm my_image:1.0.0 --spring.profiles.active=local,$@会被替换为传递的参数,最终传递给Spring Boot应用。
- 结合ENTRYPOINT与CMD定义默认参数
也可以用shell形式ENTRYPOINT配合CMD设置默认启动参数,同时允许通过docker run命令覆盖:
ENTRYPOINT exec java org.springframework.boot.loader.JarLauncher CMD []
启动时追加的参数会自动作为CMD的内容,传递给ENTRYPOINT中的应用命令。
内容的提问来源于stack exchange,提问作者wujek
相关产品推荐
相关产品推荐

