如何在入口点数组中使用Docker环境变量?

如何在入口点数组中使用Docker环境变量?,docker,dockerfile,Docker,Dockerfile,如果我设置了一个环境变量,比如说ENV ADDRESSEE=world,我想在连接成固定字符串的入口点脚本中使用它,如: ENTRYPOINT ["./greeting", "--message", "Hello, world!"] 由于world是环境变量的值,我该怎么做?我试着使用“你好,$ADDRESSEE”,但这似乎不起作用,因为它从字面上理解了$ADDRESSEE。您使用的是ENTRYPOINT的exec表单。与shell表单不同,exec表单不调用命令shell。这意味着正常的sh

如果我设置了一个环境变量,比如说
ENV ADDRESSEE=world
,我想在连接成固定字符串的入口点脚本中使用它,如:

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

由于
world
是环境变量的值,我该怎么做?我试着使用
“你好,$ADDRESSEE”
,但这似乎不起作用,因为它从字面上理解了
$ADDRESSEE

您使用的是ENTRYPOINT的exec表单。与shell表单不同,exec表单不调用命令shell。这意味着正常的shell处理不会发生。例如,
ENTRYPOINT[“echo”,“$HOME”]
不会对$HOME进行变量替换。如果需要shell处理,则可以使用shell表单或直接执行shell,例如:
ENTRYPOINT[“sh”、“-c”、“echo$HOME”]

当使用exec表单并直接执行shell时,就像shell表单一样,执行环境变量扩展的是shell,而不是docker

在您的情况下,我将使用shell表单

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

我试图用建议的答案解决问题,但还是遇到了一些问题

这是我问题的解决方案:

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]
特别针对您的问题:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

在经历了巨大的痛苦和@vitr等人的大力帮助后,我决定尝试一下

  • 标准bash替换
  • 入口点的外壳形式(从上方看大尖端)
这起作用了

ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}
e、 g

两者都在我的容器中正确设置了端口

裁判
参见《我的casw》中的,工作方式如下:(适用于docker中的Spring boot应用程序)

在docker run上传递参数

docker run --env IDMACHINE=Idmachine -p 8383:8383 my-app-name

对我来说,我希望将脚本的名称存储在一个变量中,并且仍然使用exec表单

起初我做了一些类似的事情:

ENTRYPOINT[“${BASE_FOLDER}/scripts/ENTRYPOINT.sh”]
但是很明显,这不起作用,因为我们使用的是shell表单,并且列出的第一个程序需要是
路径上的可执行文件。为了解决这个问题,我最终做了以下工作:

ENTRYPOINT[“/bin/bash”、“-c”、“exec${BASE_FOLDER}/scripts/ENTRYPOINT.sh\”${@}\”、“--”]
这样做是为了允许我们获取传递给
/bin/bash
的任何额外参数,并在bash解析名称后将这些参数提供给脚本


--
A——表示选项结束并进一步禁用 选项处理。将处理--之后的任何参数 作为文件名和参数。关于-is的争论 相当于


以下是对我有效的方法:

ENTRYPOINT [ "/bin/bash", "-c", "source ~/.bashrc && ./entrypoint.sh ${@}", "--" ]

现在,您可以为
docker run
命令提供任何参数,并且仍然可以读取所有环境变量。

ENTRYPOINT java-jar/dockertest.jar-Djava.security.egd=file:/dev//uradom-Dserver.port=$port
,而
ENV-port=123
。端口环境未解析。知道为什么吗?虽然它有效,但似乎产生了一些新问题,比如没有将传递的参数包含到该入口点。例如,您不能将
--态度“叫喊”
参数添加到
docker run
命令中,该命令应传递给
/greeting
使用
入口点。/greeting--消息“Hello,$ADDRESSEE\!$0$@”
如果您还想通过
docker run
调用将附加变量传递到
/greeting
(或传递docker文件的
CMD
),请注意shell表单可能会导致信号无法传递到流程(在您的示例中为
greeting
)。我能以exec的形式得到环境变量的值吗,比如“[myexecutable.sh,“$variable””,我可以通过[“sh”、“-c”,“echo$var”]来得到,但不是用这种方式。你的答案似乎没有提供OP问题的完整解决方案。我想我不明白它为什么不能为OP的问题提供解决方案。。。我更新了一个例子来解决这个问题。你提到了你仍然遇到了一些问题!!正确,这就是我引入新解决方案的原因。。。“被接受”的答案对我不起作用,所以我附和了一个shell脚本,它起了作用。我很想听听你的方法@reveredtim;)这很有效。如果没有
“--”
bash将窃取第一个参数,并且永远不会将其提供给脚本,
“--”
使事情按预期进行。然而,有两项改进。1) 该命令应以exec开头:
“exec${BASE\u FOLDER}/…”
。否则脚本/可执行文件将无法正确接收信号。2) 它应该是
\“${}\”
,而不仅仅是
${}
,以便正确处理传递给CMD的引用参数。@Mike什么样的信号不会被接收?@smac98根据,如果shell是父进程,当运行
docker stop…
时,它不会将
SIGTERM
传播到脚本中。您可以搜索有关“docker pid 1信号”的更多信息,或者阅读,例如,中的。另外,请注意,
ENTRYPOINT
数组元素不允许单引号,它们需要双引号。@Mike,我认为添加
exec
不会解决这个问题。如果脚本包含以下内容:
sleep 10;echo foo|tee--append/tmp/foo.out
(不要忘记
#!/bin/bash
),我希望如果我们按照您的建议使用
exec
运行此脚本,然后立即按CTRL+Z,即
SIGSTOP
,那么sleep命令也会停止,但情况并非如此。
sleep
命令保持运行,如果您在恢复脚本之前等待足够长的时间,脚本恢复后,它将不会保持睡眠,而是立即打印
foo
。也许我在这里遗漏了什么,但这就是你所期望的吗?@Mike这种行为和st
ENTRYPOINT java -DidMachine=${IDMACHINE} -jar my-app-name
docker run --env IDMACHINE=Idmachine -p 8383:8383 my-app-name
ENTRYPOINT [ "/bin/bash", "-c", "source ~/.bashrc && ./entrypoint.sh ${@}", "--" ]