如果我设置了一个环境变量,比如ENV ADDRESSEE=world
,我想在连接成固定字符串的入口点脚本中使用它,如:
ENTRYPOINT ["./greeting", "--message", "Hello, world!"]
world
是环境变量的值,我该怎么办?我尝试使用"Hello, $ADDRESSEE"
,但这似乎不起作用,因为字面上需要$ADDRESSEE
。
答案 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 解析后将这些相同的参数提供给我们的脚本。
--
A -- 表示选项结束并进一步禁用
选项处理。处理 -- 之后的任何参数
作为文件名和参数。 - 的参数是
相当于 --.
答案 4 :(得分:0)
在经历了很多痛苦之后,并得到了@vitr等人的巨大帮助,我决定尝试
,并且有效。
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
命令提供任何参数,并且仍然读取所有环境变量。