Docker中通过参数运行已编译Java类报错如何解决
问题原因分析
- 类名不匹配:你当前执行命令中指定的
com.myapp.Server类不存在,本次构建过程只编译了com.myapp.HelloWorld1和com.myapp.HelloWorld2两个主类。 - ENTRYPOINT写法错误:Dockerfile中
ENTRYPOINT java用的是shell格式,这种格式会将命令作为/bin/sh -c的子进程启动,你在docker run时追加的参数不会被传递给java命令,相当于只执行了无参数的java,因此返回用法提示。你看到的提示翻译如下:
用法: java [选项] <主类> [参数...] (执行类) 或 java [选项] -jar <jar文件> [参数...] (执行jar包) 或 java [选项] -m <模块>[/<主类>] [参数...] java [选项] --module <模块>[/<主类>] [参数...] (执行模块中的主类) 或 java [选项] <源文件> [参数] (执行单个源文件程序) 跟在主类、源文件、-jar <jar文件>、-m 或 --module <模块>/<主类> 后面的参数,会被传递给主类的main方法。
解决步骤
- 修改Dockerfile最后一行的ENTRYPOINT为exec格式,保证参数可以正常传递:
# 把原来的 ENTRYPOINT java 替换为下面的写法 ENTRYPOINT ["java"]
- 重新构建镜像:
docker build -t myapp-image .
- 分别执行两个已编译的程序:
- 运行HelloWorld1:
docker run myapp-image com.myapp.HelloWorld1 - 运行HelloWorld2:
docker run myapp-image com.myapp.HelloWorld2
内容的提问来源于stack exchange,提问作者Enzo Matheus
相关产品推荐
相关产品推荐

