1. 概述

本文我们将通过示例学习如何在 Dockerfile 中传递环境变量,将用到 ARG 指令。

2. Dockerfile 环境变量 vs. 容器环境变量

Dockerfile 是一个 用于构建 Docker 镜像的脚本。而 Docker 容器是一个可运行的镜像实例。根据我们的需求,我们可以在镜像构建时设置环境变量,或在容器运行时设置环境变量

容器运行时设置环境变量比较简单,这里不做讨论。本文,我们将仅关注如何通过 Dockerfile 传递环境变量,结合 docker build 实现构建镜像时自定义环境变量。

3. Dockerfile 示例

在了解如何在 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

4. Dockerfile 设置环境变量

Dockerfile 中可以使用 ENV 来创建环境变量。然后 我们可以在构建期间以及容器运行后访问 ENV 值

让我们看看如何使用它将变量传递给我们的 greetings.sh 脚本。有二种不同的方法可以做到这一点。

4.1. 写死环境变量

方法一将环境变量硬编码到我们的 Dockerfile 中:

FROM alpine:latest

ENV env_name John

COPY greetings.sh .

RUN chmod +x /greetings.sh

CMD ["/greetings.sh"]

构建并运行容器后,控制台预期会输出:

Hello John

4.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 值重新构建镜像即可。

5. 总结

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

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

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