1. 概述

环境变量是外部化应用程序配置的一种方便方式,因此它们对于构建 Docker 容器也非常有用。然而,在 Dockerfile 中传递和使用它们可能不像看起来那么简单。

在这篇简短教程中,我们将学习如何在 Dockerfile 中传递环境变量值。首先,我们将展示在构建过程中将环境变量传递给构建过程可能有用的场景。然后我们将解释我们用来实现这一目标的 ARG 命令。最后,我们将查看一个工作示例。

2. Dockerfile 中的环境变量与容器

Dockerfile 是一个 包含构建 Docker 镜像所需指令的脚本。相反,Docker 容器是一个可运行的镜像实例。根据我们的需求,我们可能需要在构建时间或运行时环境变量上进行自定义。在这篇文章中,我们将仅关注通过 Dockerfile 向环境变量传递,以便与 docker build 一起使用。

3. 使用 Dockerfile 中的环境变量的优势

使用环境变量的最大优势是灵活性。我们可以创建一个仅需根据用于构建容器的环境进行不同配置的单个 Dockerfile。作为说明,想象一下一个在开发环境中启用了调试选项的应用程序,而在生产环境中相同选项被禁用。使用环境变量,我们只需要创建一个 Dockerfile,它会将表示调试标志的环境变量传递给容器和应用程序内部。

另一个重要的优势是安全性问题。直接将密码或其他敏感信息存储在 Dockerfile 中可能不是一个好主意。环境变量有助于解决这个问题。

4. 示例配置

在了解如何在 Dockerfile 中传递环境变量值之前,让我们构建一个示例来测试它。

我们将创建一个名为 greetings.sh 的简单 bash 脚本,该脚本使用环境变量在控制台上打印问候语:

#!/bin/sh

echo Hello $env_name

现在我们将在同一目录下创建 Dockerfile

FROM alpine:latest

COPY greetings.sh .

RUN chmod +x /greetings.sh

CMD ["/greetings.sh"]

它复制我们的脚本、使其可执行,并运行它。让我们构建镜像:

docker build -t baeldung_greetings .

然后我们将运行它:

docker run baeldung_greetings

我们应在控制台中看到一行内容:

Hello

5. 在 Dockerfile 中传递环境变量

Dockerfile 提供了一种专用的变量类型 ENV 来创建环境变量。我们可以在构建期间以及容器运行后访问 ENV 值

让我们看看如何使用它将值传递给我们的问候脚本。有二种不同的方法可以做到这一点。

5.1. 硬编码环境值

传递环境值的最简单方法是在 Dockerfile 中硬编码它。在某些情况下,这足够好了。让我们将默认名称 John 硬编码到我们的 Dockerfile 中:

FROM alpine:latest

ENV env_name John

COPY greetings.sh .

RUN chmod +x /greetings.sh

CMD ["/greetings.sh"]

现在我们将构建并运行我们的镜像。以下是预期的控制台输出:

Hello John

5.2. 设置动态环境值

Dockerfile 不提供在构建过程中动态设置 ENV 值的工具。但是,有一个解决方案来解决这个问题。我们需要使用 ARGARG 值与 ENV 不同,构建完成后我们就无法再访问它们。让我们看看如何绕过这个问题:

ARG name
ENV env_name $name

我们将引入 name ARG 变量。然后我们将使用它将值分配给 env_name 环境变量使用 ENV

当我们想要设置这个参数时,我们将使用 –build-arg 标志传递它:

docker build -t baeldung_greetings --build-arg name=Baeldung .

现在我们将运行容器。我们应该看到:

Hello Baeldung

如果我们想更改名称怎么办?我们只需使用不同的 build-arg 值重新构建镜像即可。

6. 总结

在这篇文章中,我们学习了如何在 Dockerfile 构建过程中设置环境变量。

首先,我们看到了参数化 Dockerfile 的优点。然后我们演示了如何使用 ENV 命令设置环境变量,以及如何使用 ARG 允许在构建时修改此值。

如往常一样,文章的完整源代码可在 GitHub 上获取。