從 Docker 容器中獲取環境變量
- Docker
一、概述
Docker 是一個容器化平台,它將應用程序及其所有依賴項打包在一起。理想情況下,這些應用程序需要特定的環境才能啟動。在 Linux 中,我們使用環境變量來滿足這個要求。這些變量決定了應用程序的行為。
在本教程中,我們將學習檢索在運行 Docker 容器時設置的所有環境變量。就像有多種方法可以將環境變量傳遞給 Docker 容器一樣,一旦設置了這些變量,就有不同的方法可以獲取這些變量。
在我們進一步討論之前,讓我們先了解一下環境變量的必要性。
2.了解Linux中的環境變量
環境變量是一組動態的鍵值對,可在系統範圍內訪問。這些變量可以幫助系統定位包,配置任何服務器的行為,甚至使 bash 終端輸出直觀。
默認情況下,主機上的環境變量不會傳遞給 Docker 容器。原因是 Docker 容器應該與宿主環境隔離。所以,如果我們想在 Docker 容器中使用環境,那麼我們必須明確地設置它。
現在讓我們研究從 Docker 容器內部獲取環境變量的不同方法。
3. 使用docker
exec
命令獲取
出於演示的目的,讓我們首先運行一個Alpine Docker 容器並將一些環境變量傳遞給它:
docker run -itd --env "my_env_var=tutorial" --name mycontainer alpine
9de9045b5264d2de737a7ec6ba23c754f034ff4f35746317aeefcea605d46e84
在這裡,我們在名為tutorial
my_env_var
mycontainer
。
現在讓我們使用 docker docker exec
命令獲取名為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=tutorial
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=tutorial
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
tutorial
**printenv
是另一個在 Linux 中顯示環境變量的命令行實用程序。**在這裡,我們將環境變量名稱my_env_var
作為參數傳遞給printenv
。這將打印my_env_var
的值。
這種方法的缺點是 Docker 容器必須處於運行狀態才能檢索環境變量。
4. 使用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 exec
和docker inspect
命令一起使用。
與docker exec
不同, docker inspect
命令適用於已停止和正在運行的容器。
5. 結論
在本文中,我們學習瞭如何從 Docker 容器中檢索所有環境變量。我們首先討論了環境變量在 Linux 中的重要性。然後我們查看了docker exec
和docker inspect
命令來檢索環境變量。
docker exec
方法有一些限制,而docker inspect
命令在所有情況下都運行。