如何在ENTRYPOINT数组中使用Docker环境变量?


109

如果设置了环境变量,请说ENV ADDRESSEE=world,然后在连接到固定字符串的入口点脚本中使用它,例如:

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

world作为环境varible的价值,我该怎么办呢?我尝试使用,"Hello, $ADDRESSEE"但这似乎不起作用,因为它$ADDRESSEE确实是正确的。

Answers:


216

您正在使用ENTRYPOINT 的exec形式。与shell表单不同,exec表单不会调用命令shell。这意味着正常的外壳处理不会发生。例如,ENTRYPOINT [ "echo", "$HOME" ]将不会在$ HOME上进行变量替换。如果要进行shell处理,则可以使用shell形式或直接执行shell,例如:ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
当使用exec表单并直接执行shell时(例如在shell表单中),是由shell进行环境变量扩展,而不是docker。(来自Dockerfile参考

在你的情况下,我会使用外壳形式

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

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$port一会儿ENV port=123。ENV端口未解析。有什么想法吗?
xetra11

1
当它起作用时,似乎会产生一些新问题,例如不包括传递给该入口点的参数。例如,您不能--attitude "shouting"在该docker run命令中添加参数,而该参数应传递给./greeting
Daniel F

5
使用ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@",如果你也想通过额外的变量./greeting通过docker run调用(或传递CMD的Dockerfile的)
丹尼尔˚F

3
请注意,shell形式可能导致信号无法传递到流程(greeting在您的示例中)。hynek.me/articles/docker-signals
jbg

我可以获取exec形式的环境变量的值吗,例如`[myexecutable.sh,“ $ variable”],我可以通过[“ sh”,“ -c”,“ echo $ var”]来做到这一点,但不能以这种方式
lazarus

13

我尝试解决建议的答案,但仍然遇到了一些问题...

这是我的问题的解决方案:

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"]

看来您的答案并未提供OP问题的完整解决方案
user9405863 '18

我想我不明白它如何不能为OP的问题提供解决方案...我更新了一个示例,以解决确切的问题。
本·考夫曼

你提到你仍然遇到了一些问题!
user9405863 '18

正确,这就是我引入新解决方案的原因。...“已接受”的答案对我不起作用,因此我回显了一个shell脚本,并且该命令有效。
本·考夫曼

2
我想听听您的方法,然后@ReverendTim;)
Ben Kauffman

6

经过许多痛苦和@vitr等人的大力协助,我决定尝试

  • 标准bash替代
  • 外壳形式入口点(从上面极大尖端)

而且有效。

ENV LISTEN_PORT=""

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

例如

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

docker run --rm -p 8080:80 -d my-image

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

参考

参见https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.