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

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

world是环境变量的值,我该怎么做呢?我尝试使用“你好,$ADDRESSEE”,但这似乎不工作,因为它需要$ADDRESSEE字面上。


当前回答

在经历了很多痛苦和@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

and

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

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

Refs

见https://www.cyberciti.biz/tips/bash -壳参数替换- 2. - html

其他回答

我使用上面“创建自定义脚本”方法的变体解决了这个问题。是这样的:

FROM hairyhenderson/figlet
ENV GREETING="Hello"
RUN printf '#!/bin/sh\nfiglet -W \${GREETING} \$@\n' > /runme && chmod +x /runme
ENTRYPOINT ["/runme"]
CMD ["World"]

docker container run -it --rm -e GREETING="G'Day" dockerfornovices/figlet-greeter Alec

我很简单地解决了这个问题!

重要提示:你希望在ENTRYPOINT中使用的变量必须是ENV类型(而不是ARG类型)。

例# 1:

ARG APP_NAME=app.jar                    # $APP_NAME can be ARG or ENV type.
ENV APP_PATH=app-directory/$APP_NAME    # $APP_PATH must be ENV type.
ENTRYPOINT java -jar $APP_PATH

这将导致执行: Java -jar app-directory/app.jar

例2(你的问题):

ARG ADDRESSEE="world"                       # $ADDRESSEE can be ARG or ENV type.
ENV MESSAGE="Hello, $ADDRESSEE!"            # $MESSAGE must be ENV type.
ENTRYPOINT ./greeting --message $MESSAGE

这将导致执行: 你好,世界!

请确认,在分配字符串变量时是否需要引号""。


我的建议:尽可能使用ENV而不是ARG,以避免您的部分或SHELL方面的混淆。

You're using the exec form of ENTRYPOINT. Unlike the shell form, the exec form does not invoke a command shell. This means that normal shell processing does not happen. For example, ENTRYPOINT [ "echo", "$HOME" ] will not do variable substitution on $HOME. If you want shell processing then either use the shell form or execute a shell directly, for example: ENTRYPOINT [ "sh", "-c", "echo $HOME" ]. When using the exec form and executing a shell directly, as in the case for the shell form, it is the shell that is doing the environment variable expansion, not docker.(from Dockerfile reference)

在你的例子中,我会用壳层形式

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

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

注意:确保您试图使用的变量通过命令行或ENV指令声明为环境变量。

最初我是这样做的:

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

但显然这行不通,因为我们使用的是shell形式,列出的第一个程序需要是PATH上的可执行文件。所以为了解决这个问题,这就是我最后做的:

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

注意,双引号是必需的

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


男人7狂欢

——A——表示选项结束并进一步禁用 选择处理。之后的任何争论都会被处理 作为文件名和参数。是的论点 相当于——。

在我的案例中,工作方式是这样的:(用于docker中的Spring引导应用程序)

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

并在docker运行时传递参数

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