Docker 容器中如何獲取環(huán)境變量
大家好,我是指北君。
Docker是一個容器化的平臺,它將一個應(yīng)用程序連同其所有的依賴關(guān)系打包。大部分情況下,這些應(yīng)用程序需要一個特定的環(huán)境來啟動。在Linux中,我們使用環(huán)境變量來滿足這一要求。這些變量決定了應(yīng)用程序的行為。
在本文中,我們將學習如何檢索在運行 Docker 容器時設(shè)置的所有環(huán)境變量。就像有多種方法向Docker容器傳遞環(huán)境變量一樣,一旦設(shè)置了這些變量,也有不同的方法來獲取這些變量。
首先讓我們了解一下環(huán)境變量的必要性。
Linux 中的環(huán)境變量
環(huán)境變量是一組動態(tài)的鍵值對,可以在整個系統(tǒng)中訪問。這些變量可以幫助系統(tǒng)定位軟件包,配置任何服務(wù)器的行為,甚至使 bash 終端的輸出更直觀。
默認情況下,主機上的環(huán)境變量不會被傳遞給 Docker 容器。原因是 Docker 容器應(yīng)該是與主機環(huán)境隔離的。因此,如果我們想在 Docker 容器中使用環(huán)境,那么我們必須明確地設(shè)置它。
現(xiàn)在讓我們來看看從 Docker 容器內(nèi)部獲取環(huán)境變量的幾種方法。
使用 docker exec 命令獲取信息
為了演示,讓我們首先運行一個 Docker 容器,并向它傳遞一些環(huán)境變量。
docker run -itd --env "my_env_var=javanorth" --name mycontainer
在這里,我們將 my_env_var 的值 javanorth 傳遞到名為 mycontainer 的 Docker 容器中。
現(xiàn)在讓我們使用 docker exec 命令來獲取名為 my_env_var 的環(huán)境變量。
$ docker exec mycontainer /usr/bin/env
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=xxxxxxxxx
my_env_var=javanorth
HOME=/root
我們正在 Docker 容器內(nèi)執(zhí)行 /usr/bin/env 工具。使用這個工具,你可以查看 Docker 容器內(nèi)設(shè)置的所有環(huán)境變量。注意,我們的 my_env_var 也出現(xiàn)在輸出中。
我們還可以使用下面的命令來實現(xiàn)類似的結(jié)果。
$ docker exec mycontainer /bin/sh -c /usr/bin/env
HOSTNAME=xxxxxxxxx
SHLVL=1
HOME=/root
my_env_var=javanorth
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
PWD=/
注意,與之前的輸出相比,有更多的環(huán)境變量。這是因為這次我們是在 /bin/sh 二進制的幫助下執(zhí)行命令的。這個二進制文件隱含地設(shè)置了一些額外的環(huán)境變量。
另外,/bin/sh shell并不是所有的 Docker 鏡像都必須存在的。例如,在包含 /bin/bash shell的 centos Docker 鏡像中,我們將使用以下命令來檢索環(huán)境變量。
$ docker run -itd --env "container_type=centos" --name centos_container centos
$ docker exec centos_container bash -c /usr/bin/env
container_type=centos
HOSTNAME=xxxxxxxx
PWD=/
HOME=/root
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
_=/usr/bin/env
我們也可以使用 docker exec 命令來獲取單個環(huán)境變量的值。
$ docker exec mycontainer printenv my_env_var
javanorth
printenv 是另一個命令行工具,用于顯示 Linux 中的環(huán)境變量。在這里,我們將環(huán)境變量的名稱 my_env_var 作為參數(shù)傳給 printenv。這將打印出 my_env_var 的值。
這種方法的缺點是,為了檢索環(huán)境變量,Docker容器必須處于運行狀態(tài)。
使用 docker inspect 命令獲取
現(xiàn)在讓我們來看看另一種在 Docker 容器處于停止狀態(tài)時獲取環(huán)境變量的方法。我們將使用docker inspect 命令來實現(xiàn)這一目的。
docker inspect 提供所有 Docker 資源的詳細信息。輸出是JSON格式的。因此,我們可以根據(jù)我們的要求過濾輸出。
讓我們操作 docker inspect 命令,只顯示容器的環(huán)境變量。
$ docker inspect mycontainer --format "{{.Config.Env}}"
[my_env_var=javanorth PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin]
在這里,我們使用-format選項過濾了 docker inspect 輸出中的環(huán)境變量。同樣,輸出中出現(xiàn)了my_env_var。
與docker exec不同的是,docker inspect命令對停止和運行的容器都有效。
總結(jié)
在這篇文章中,我們學習了如何從 Docker 容器中檢索所有的環(huán)境變量。我們首先討論了Linux中環(huán)境變量的重要性。然后我們了解了 docker exec 和 docker inspect 命令來檢索環(huán)境變量。
docker exec方法有一些限制,而docker inspect命令可以在所有情況下運行。