概述

Docker 是一个容器化平台,它将应用程序及其所有依赖项打包在一起。理想情况下,这些应用程序需要特定的环境才能启动。在 Linux 中,我们使用环境变量来满足这一需求。这些变量决定了应用程序的行为。

在这篇教程中,我们将学习如何检索在运行 Docker 容器时设置的所有环境变量。与传递环境变量到 Docker 容器的方式一样,设置这些变量后有多种方法可以获取它们。

在继续之前,让我们首先理解环境变量的需求。

了解 Linux 中的环境变量

环境变量是全局可访问的一组键值对。这些变量可能有助于系统定位包、配置任何服务器的行为,甚至使 bash 终端输出直观。

默认情况下,主机机器上的环境变量不会传递给 Docker 容器。原因是 Docker 容器应该与主机环境隔离。因此,如果要在 Docker 容器中使用环境,则必须明确设置它。

现在,让我们查看从 Docker 容器内部获取环境变量的不同方法。

使用 docker exec 命令获取

为了演示目的,我们首先运行一个 Alpine Docker 容器,并向其中传递一些环境变量:

docker run -itd --env "my_env_var=baeldung" --name mycontainer alpine
9de9045b5264d2de737a7ec6ba23c754f034ff4f35746317aeefcea605d46e84

在这里,我们向名为 mycontainer 的 Docker 容器中传入 my_env_var,其值为 baeldung

现在,我们可以使用 docker exec 命令从 Docker 容器内部获取名为 my_env_var 的环境变量:

$ docker exec mycontainer /usr/bin/env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=9de9045b5264
my_env_var=baeldung
HOME=/root

在这里,我们在 Docker 容器中执行了 /usr/bin/env 工具。使用此工具,您可以查看 Docker 容器内设置的所有环境变量。注意,我们的 my_env_var 也在输出中出现。

我们还可以使用以下命令实现类似结果:

$ docker exec mycontainer /bin/sh -c /usr/bin/env
HOSTNAME=9de9045b5264
SHLVL=1
HOME=/root
my_env_var=baeldung
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/

注意,与前一输出相比,这次的输出中有更多的环境变量。 这是因为这次我们使用 /bin/sh 二进制文件执行命令。这个二进制文件隐式设置了额外的环境变量。

此外,*/bin/sh* shell 并不一定存在于所有 Docker 镜像中。例如,在包含 /bin/bash shell 的 centos Docker 镜像中,我们使用以下命令检索环境变量:

$ docker run -itd --env "container_type=centos" --name centos_container centos
aee6f2718f18723906f7ab18ab9c37a539b6b2c737f588be71c56709948de9eb
$ docker exec centos_container bash -c /usr/bin/env
container_type=centos
HOSTNAME=aee6f2718f18
PWD=/
HOME=/root
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env

我们还可以使用 docker exec 命令获取单个环境变量的值:

$ docker exec mycontainer printenv my_env_var
baeldung

printenv 是另一个用于显示 Linux 中环境变量的命令行工具。 我们将 my_env_var 环境变量作为参数传递给 printenv 命令。这将打印 my_env_var 的值。

这种方法的缺点是 必须让 Docker 容器处于运行状态 才能获取环境变量。

使用 docker inspect 命令获取

现在,让我们看看在 Docker 容器处于停止状态时获取环境变量的另一种方法。我们将使用 docker inspect 命令进行此操作。

docker inspect 提供了所有 Docker 资源的详细信息。输出以 JSON 格式提供。因此,我们可以根据需求过滤输出。

让我们将 docker inspect 命令修改为仅显示容器的环境变量:

$ docker inspect mycontainer --format "{{.Config.Env}}"
[my_env_var=baeldung PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]

在这里,我们使用 –format 选项从 docker inspect 输出中筛选环境变量。再次,my_env_var 在输出中出现。

我们还可以使用 docker inspect 命令获取单个环境变量:

$ docker inspect mycontainer | jq -r '.[].Config.Env[]|select(match("^my_env_var"))|.[index("=")+1:]'
baeldung

jq 是一个轻量级 JSON 处理器,可以解析和转换 JSON 数据。在这里,我们将 docker inspect 的 JSON 输出传递给 jq 命令。然后,它搜索 my_env_var 变量并通过分隔符 “=” 显示其值。

请注意,我们也可以使用容器 ID 与 docker execdocker inspect 命令一起使用。

docker exec 相比,docker inspect 命令在所有情况下都有效。

结论

在这篇文章中,我们学习了如何从 Docker 容器中检索所有环境变量。我们首先讨论了 Linux 中环境变量的重要性。然后,我们查看了 docker execdocker inspect 命令以检索环境变量。

docker exec 方法相比,docker inspect 命令在所有情况下都有效,而 docker exec 方法则有一些限制。