【问题标题】:Dockerfile of console application that accept arguments in Commons CLI style以 Commons CLI 样式接受参数的控制台应用程序的 Dockerfile
【发布时间】:2018-12-14 02:32:33
【问题描述】:

我有一个 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

但我的程序没有得到参数。我错过了什么?

【问题讨论】:

    标签: java docker dockerfile apache-commons-cli


    【解决方案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}" ]
    

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

    【讨论】:

      【解决方案2】:

      您传递给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 命令行

      【讨论】:

      • 我在制作这个答案时学到的东西:ENTRYPOINT /bin/wrapper.sh 不会得到论据,但ENTRYPOINT ["/bin/wrapper.sh"]
      • 感谢您的解释。我决定只创建一个 ENV 参数,用于在一个字符串中传递我的所有参数,例如 docker run -e args="-arg1=145 -arg2=345 -arg3=99" myProject:0.3
      • 这适用于大多数情况,但要注意参数中的空格。
      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 2015-03-03
      • 2011-05-07
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多