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

时间:2016-06-19 06:49:36

标签: docker dockerfile

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

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

world是环境变量的值,我该怎么办?我尝试使用"Hello, $ADDRESSEE",但这似乎不起作用,因为字面上需要$ADDRESSEE

6 个答案:

答案 0 :(得分:132)

您正在使用ENTRYPOINT的 exec表单。与 shell表单不同, exec表单不会调用命令shell。这意味着不会发生正常的shell处理。例如,ENTRYPOINT [ "echo", "$HOME" ]不会对$ HOME执行变量替换。如果您需要shell处理,请使用 shell表单或直接执行shell,例如:ENTRYPOINT [ "sh", "-c", "echo $HOME" ]
当使用exec表单并直接执行shell时(如shell表单的情况),它是执行环境变量扩展的shell,而不是docker。(来自Dockerfile reference

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

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

答案 1 :(得分:6)

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

这是我问题的解决方案:

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

答案 2 :(得分:2)

在我的 casw 中是这样工作的:(对于 docker 中的 Spring Boot 应用程序)

ENTRYPOINT java -DidMachine=${IDMACHINE} -jar my-app-name

并在 docker run 上传递参数

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

答案 3 :(得分:1)

对我来说,我想将脚本的名称存储在一个变量中,并且仍然使用 exec 形式。

最初我做了类似的事情:

ENTRYPOINT [ "${BASE_FOLDER}/scripts/entrypoint.sh" ]

但显然这不起作用,因为我们使用的是 shell 表单并且列出的第一个程序需要是 PATH 上的可执行文件。所以为了解决这个问题,这就是我最终要做的:

ENTRYPOINT [ "/bin/bash", "-c", "exec ${BASE_FOLDER}/scripts/entrypoint.sh \"${@}\"", "--" ]

这样做是为了让我们能够接受传递给 /bin/bash 的任何额外参数,并在名称被 bash 解析后将这些相同的参数提供给我们的脚本。


man 7 bash

<块引用>

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

答案 4 :(得分:0)

在经历了很多痛苦之后,并得到了@vitr等人的巨大帮助,我决定尝试

  • 标准bash替代
  • ENTRYPOINT
  • 外壳形式(上方的尖头)

,并且有效。

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

答案 5 :(得分:0)

这对我有用:

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

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