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