java - 以 Commons CLI 样式接受参数的控制台应用程序的 Dockerfile
问题描述
我有一个 java 控制台应用程序,我打包为 jar 并运行它
java -jar target/myProject-1.0-SNAPSHOT.jar -arg1 145 -arg2 345 -arg3 99
我想在容器中运行相同的命令并将这些参数(arg1、arg2、arg3)传递给 docker run 命令。我的码头文件看起来像:
FROM openjdk:8-jdk-alpine
VOLUME /tmp
ADD target/myProject-1.0-SNAPSHOT.jar myProject-1.0-SNAPSHOT.jar
ENV JAVA_OPTS=""
ENTRYPOINT [ "sh", "-c", "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar" ]
然后我尝试按如下方式运行图像:
docker run myProject:0.3 -e -arg1 145 -arg2 345 -arg3 99
但我的程序没有得到论据。我错过了什么?
解决方案
您传递给的参数docker run
是它正在运行的命令,它附加到入口点的末尾。所以你正在做的相当于运行:
sh -c "java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar" -arg1 145 -arg2 345 -arg3 99
像这样呈现,你可以看到论点是去sh
和不去java
。如果您想将构建映像时定义的一组选项与可以在运行时附加的一组选项结合起来,则需要使用包装脚本或类似的东西。
创建文件 wrapper.sh 并使其可执行:
#!/bin/sh exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar "$@"
ADD wrapper.sh /bin
在 Dockerfile 中将其添加到您的容器中- 将您的入口点更改为
["/bin/wrapper.sh"]
- 现在,当您运行映像时,它会将参数附加到
java
命令行
推荐阅读
- swift - 从数据库加载数据并将其加载到 Vapor 3 中的视图的正确方法?
- ios - 通知 ios 上的自定义音频播放器控件
- bazel - Bazel-如何获取目标的所有传递源
- ios - 我如何将 NSRangeException 解决为 swift 4?
- python - 将scrapy项目导出到不同的文件
- opengl-es-2.0 - 开启深度测试,还是不行?
- ruby-on-rails - Rails 说没有路线匹配,但我在“rake 路线”中看到它
- reactjs - 组件不会重新渲染
- string - 将字符串的索引与字符进行比较
- java - 如何修复运行 Hadoop 程序的 Eclipse 中的 InputBootStrapper 错误?