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 值的工具。但是,有一个解决方案来解决这个问题。我们需要使用 ARG。ARG 值与 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 上获取。