当前位置: 首页 > 知识库问答 >
问题:

Dockerfile - 在构建时评估环境变量

包唯
2023-03-14

因为我放在容器中的应用程序的bin名称可以更改(docker构建是更大构建的一部分,我很容易将正确的名称从一个构建传递到另一个构建)我想做这样的事情:

< code >入口点["$PATH_TO_BIN"]

但由于没有外壳来评估,这通常会失败。理论上我可以去

入口点 $PATH_到_BIN

但在这种情况下,我在执行run时无法传递任何参数。

有没有可能在构建期间使用exec form并计算args或env变量(这样在运行时就不需要shell了)?)

共有2个答案

曾华翰
2023-03-14

这很有可能。问题是您试图直接执行命令。相反,您需要做的是,创建一个entrypoint.sh并让它执行。该脚本可以根据环境变量确定它需要做什么。

考虑下面的Dockerfile文件

FROM centos:7.2.1511
COPY entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
CMD ["this","is", "tarun"]

entrypoint.sh 内容如下

#!/usr/bin/env sh

_load() {
   CMD=""
   if [ ! -z "$ENTRYPOINT" ]; then
      CMD=$ENTRYPOINT
   fi

   if [ "$#" -gt 0 ]; then
      CMD="$CMD $@"
   elif [ ! -z $COMMAND ]; then
      CMD="$CMD $COMMAND"
   fi

   echo "Executing - $CMD"
   exec $CMD
}

_load $@

该脚本除了检查是否传递了环境变量< code>$ENTRYPOINT或< code>$COMMAND或者两者都传递了,或者来自docker run的命令传递了之外,什么也不做。它根据以下优先级顺序运行命令

    < li >入口点运行参数-组合两者并执行 < li>ENTRYPOINT命令-组合两者并执行 < li >缺少$COMMAND - Run $ENTRYPOINT < li >缺少$ENTRYPOINT - Run $COMMAND

现在测试一下

$ docker run -e ENTRYPOINT=/bin/echo test my name "is XYZ"
Executing - /bin/echo my name is XYZ
my name is XYZ

剧本可能不是100%完美,但我只是为了证明这个想法

如果您需要一个简单的entrypoint.sh,那么您甚至可以将其替换为以下内容

exec $ENTRYPOINT $@

这也行得通。

卢杰
2023-03-14

如果您使用的是最新版本的 Docker 引擎,则可以将其添加到 Dockerfile 中:

ARG PATH_TO_BIN

然后执行以下操作:

docker build --build-arg PATH_TO_BIN=/usr/bin/

在文档中查看更多信息

 类似资料:
  • 我正在尝试将服务器URL传递给在Docker容器中运行的React应用程序。它在应用程序中发送HTTP请求时使用,访问方式如下:server_url。这在主机上存储为en环境变量。 我尝试过直接在我的does文件中设置变量:< code > ENV server _ URL = $ { server _ URL } ,我认为这不起作用,因为< code>${server_url}是针对does文件

  • 在构建docker映像时,可以将环境变量作为文件传递给Dockerfile吗? 我按照这里的建议使用了,但由于我有多个参数,我更喜欢使用一个文件。 我也尝试使用方法,但我需要在构建时添加这些参数。 提前感谢。

  • 我需要在Dockerfile中传递环境变量,如下所示。我可以知道做这件事的有效方法吗。我尝试使用构建参数 但它没有用。 这是我的 Dockerfile 所以当我运行我的docker容器时,我相信我不想向它发送任何环境变量。 请指教。

  • 问题内容: 我有一个代表路径的字符串。由于此应用程序在Windows,OSX和Linux上使用,因此我们定义了环境变量以正确映射来自不同文件系统的卷。结果是: 我想做的是评估字符串中的环境变量,以便将它们替换为各自的卷名。我是否缺少特定的命令,还是必须采取并手动替换字符串? 问题答案: 使用os.path.expandvars扩展字符串中的环境变量,例如:

  • 问题内容: 我的特定用例是,我想组织一些有关容器在其上运行的EC2实例的数据,并使我可用作环境变量。构建容器时,我想这样做。 我希望能够在Dockerfile中执行类似的操作,但毫不奇怪,这行不通(您只得到了string )。 我应该提及的是,我知道将要执行此操作,但是我特别希望将其内置到容器中。 我是否缺少明显的东西?这有可能吗? 问题答案: Docker v1.9或更高版本 如果您使用的是Do

  • 问题内容: 我正在为红宝石应用程序构建一个容器。我的应用程序的配置包含在环境变量中(通过dotenv加载到应用程序内部)。 这些配置变量之一是应用程序的公共ip,它在内部用于建立链接。我需要添加一个dnsmasq条目,将该ip指向容器内部的127.0.0.1,以便它可以获取应用程序的链接,就好像未对其进行容器化一样。 因此,我试图在我的Dockerfile中设置一个将环境变量传递给容器的。 我尝试