控制台应用程序的Dockerfile接受Commons CLI风格的参数

时间:2018-12-14 02:32:34

标签: java docker dockerfile apache-commons-cli

我有一个Java控制台应用程序,我将其打包为jar并以

身份运行
java -jar target/myProject-1.0-SNAPSHOT.jar -arg1 145 -arg2 345 -arg3 99

我想在容器内运行相同的命令,并将这些参数(arg1,arg2,arg3)传递给docker run命令。我的docker文件如下所示:

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

但是我的程序没有参数。我想念什么?

2 个答案:

答案 0 :(得分:1)

您传递给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。如果要将构建映像时定义的一组选项与可以在运行时附加的一组选项结合在一起,则需要使用包装脚本或类似的脚本。

  1. 创建wrapper.sh文件并使其可执行:

    #!/bin/sh
    exec java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /myProject-1.0-SNAPSHOT.jar "$@"
    
  2. 使用Dockerfile中的ADD wrapper.sh /bin将其添加到您的容器中

  3. 将入口点更改为["/bin/wrapper.sh"]
  4. 现在,当您运行图像时,它将把参数附加到java命令行

答案 1 :(得分:1)

您必须在DOCKERFILE中添加ENV命令,以便可以接收要传递的参数,然后将其传递到ENTRYPOINT脚本中

Dockerfile看起来像这样

FROM openjdk:8-jdk-alpine
VOLUME /tmp
ENV arg1
ENV arg2
ENV arg3
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 ${arg1} ${arg2} ${arg3}" ]

如果您有任何疑问,请告诉我