docker run传递参数给entrypoint

93
我可以使用-e选项传递环境变量。 但是我不确定如何在使用docker run命令时将命令行参数传递给入口点中的jar文件。
Dockerfile
FROM openjdk
ADD . /dir
WORKDIR /dir
COPY ./test-1.0.1.jar /dir/test-1.0.1.jar
ENTRYPOINT java -jar /dir/test-1.0.1.jar

test.sh

#! /bin/bash -l

export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)

$value=7

docker run -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY  -i -t testjava  $value
2个回答

117

使用ENTRYPOINT的执行形式

ENTRYPOINT ["java", "-jar", "/dir/test-1.0.1.jar"]

那么当您运行docker run -it testjava $value时,$value将会被“附加”到entrypoint之后,就像java -jar /dir/test-1.0.1.jar $value一样。


18
如果存在,它将覆盖Dockerfile中的CMD。 - Alex Torson
5
单引号对我不起作用,docker run myimage --build会抱怨--build: [npx,: not found](我的Dockerfile:ENTRYPOINT ['npx', 'mycommand'])。将它们更改为双引号就可以了,即 ENTRYPOINT ["npx", "mycommand"]. - zypA13510
2
你必须使用双引号,因为它实际上是使用JSON数组语法。 - Lenormju

72
你应该释放 ENTRYPOINTCMD 的组合力量。
将命令行的不希望更改的开头部分放入 ENTRYPOINT 中,将应该是可配置的尾部放入 CMD 中。然后你可以简单地将必要的参数附加到你的 docker run 命令中。就像这样:

Dockerfile

FROM openjdk
ADD . /dir
WORKDIR /dir
COPY ./test-1.0.1.jar /dir/test-1.0.1.jar
ENTRYPOINT ["java", "-jar"]
CMD ["/dir/test-1.0.1.jar"]

Sh

# this will run default jar - /dir/test-1.0.1.jar
docker run testjava

# this will run overriden jar
docker run testjava /dir/blahblah.jar

这篇文章提供了一个很好的解释。


7
好的!但如果我想要传递多个命令行参数怎么办? - xpt
4
链接URL的内容显然被替换成了不同的东西。 - Anton Strogonoff
1
java --help 中可以看到:-jar <jarfile> 后面的参数将作为主类的参数传递。因此,运行 docker run testjava /dir/blahblah.jar -myarg1 -myarg2withvalue 123。另请参阅:docker run --help - Lenormju

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接