接受 Commons CLI 样式参数的控制台应用程序的 Dockerfile
Dockerfile of console application that accept arguments in Commons CLI style
我有一个 java 控制台应用程序,我将其打包为 jar 并 运行 将其打包为
java -jar target/myProject-1.0-SNAPSHOT.jar -arg1 145 -arg2 345 -arg3 99
我想 运行 容器内的相同命令并将这些参数(arg1、arg2、arg3)传递给 docker 运行 命令。我的 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
但是我的程序没有得到参数。我缺少什么?
您传递给 docker run
的参数是它 运行ning 的命令,它附加到入口点的末尾。所以你所做的相当于 运行ning:
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 "$@"
在 Dockerfile
中使用 ADD wrapper.sh /bin
将其添加到您的容器中
- 将您的入口点更改为
["/bin/wrapper.sh"]
- 现在,当您 运行 图片时,它会将参数附加到
java
命令行
您必须在 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}" ]
如果您有任何问题,请告诉我
我有一个 java 控制台应用程序,我将其打包为 jar 并 运行 将其打包为
java -jar target/myProject-1.0-SNAPSHOT.jar -arg1 145 -arg2 345 -arg3 99
我想 运行 容器内的相同命令并将这些参数(arg1、arg2、arg3)传递给 docker 运行 命令。我的 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
但是我的程序没有得到参数。我缺少什么?
您传递给 docker run
的参数是它 运行ning 的命令,它附加到入口点的末尾。所以你所做的相当于 运行ning:
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 "$@"
在 Dockerfile
中使用 - 将您的入口点更改为
["/bin/wrapper.sh"]
- 现在,当您 运行 图片时,它会将参数附加到
java
命令行
ADD wrapper.sh /bin
将其添加到您的容器中
您必须在 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}" ]
如果您有任何问题,请告诉我