获取 Dockerfile 中的环境变量值

新手上路,请多包涵

我正在为 ruby 应用程序构建一个容器。我的应用程序的配置包含在环境变量中(使用 dotenv 加载到应用程序中)。

这些配置变量之一是应用程序的公共 ip,它在内部用于建立链接。我需要添加一个 dnsmasq 条目,将这个 ip 指向容器内的 127.0.0.1,这样它就可以获取应用程序的链接,就好像它没有被容器化一样。

因此,我试图在我的 Dockerfile 中设置一个 ENV ,它将环境变量传递给容器。

我尝试了几件事。

 ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

一切都传递“REQUEST_DOMAIN”字符串而不是环境变量的值。有没有办法将环境变量值从主机传递到容器?

原文由 Damien MATHIEU 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 800
2 个回答

您应该在 Dockerfile 中使用 ARG 指令,该指令就是为此目的。

ARG 指令定义了一个变量,用户可以在构建时使用 --build-arg <varname>=<value> 标志使用 docker build 命令将其传递给构建器。

所以你的 Dockerfile 会有这一行:

 ARG request_domain

或者如果您更喜欢默认值:

 ARG request_domain=127.0.0.1

现在您可以在 Dockerfile 中引用此变量:

 ENV request_domain=$request_domain

然后你将像这样构建你的容器:

 $ docker build --build-arg request_domain=mydomain Dockerfile

注意 1: 如果您在 Dockerfile 中引用了 ARG 但在 --build-arg 中将其排除,则您的图像将不会构建。

注意 2: 如果用户指定了未在 Dockerfile 中定义的构建参数,则构建会输出警告:

[警告] 一个或多个构建参数 [foo] 未使用。

原文由 Daniel van Flymen 发布,翻译遵循 CC BY-SA 3.0 许可协议

所以你可以这样做: cat Dockerfile | envsubst | docker build -t my-target -

然后有一个类似于以下内容的 Dockerfile:

 ENV MY_ENV_VAR $MY_ENV_VAR

我想某些特殊字符可能存在问题,但这至少适用于大多数情况。

原文由 jonasfj 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进