您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“docker中環境變量使用與常見問題的示例分析”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“docker中環境變量使用與常見問題的示例分析”這篇文章吧。
前言
docker可以為容器配置環境變量。配置的途徑有兩種:
在制作鏡像時,通過ENV命令為鏡像增加環境變量。在容器啟動時使用該環境變量。
在容器啟動時候,通過參數配置環境變量,如果與鏡像中有重復的環境變量,會覆蓋鏡像的環境變量。
使用docker exec {containerID} env
即可查看容器中生效的環境變量。
[root@localhost ~]# docker exec 984 env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/default/bin TERM=xterm AUTHORIZED_KEYS=**None** JAVA_HOME=/usr/java/default HOME=/root ...
容器啟動的進程,也就是ENTRYPOINT+CMD中,可以通過相應的系統庫獲取容器的環境變量。
進入到容器中,查看進程的環境變量,可以通過/proc下進行查看。
cat /proc/{pid}/environ
因此,容器中的環境變量也可以通過在容器中查看1號進程的環境變量來獲取。可以通過執行cat /proc/1/environ |tr '\0' '\n'命令進行查看。
[root@localhost ~]# docker exec -it 984 cat /proc/1/environ |tr '\0' '\n' PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/java/default/bin TERM=xterm AUTHORIZED_KEYS=**None** JAVA_HOME=/usr/java/default HOME=/root ...
一般來說,從父進程產生出來的子進程都會默認繼承父進程的環境變量。因此容器中的各個進程的環境變量應該是大致相同的。當然,在一些特殊的情況下,環境變量也會被重置,導致產生一些誤解和問題。下面就對容器中一些常見的情況進行相關講解。
常見問題及解決
切換不同用戶后環境變量消失
在容器中,啟動后切換不同用戶,比如使用su - admin
切換admin用戶后,發現配置的容器環境變量丟失了。
這是因為切換用戶會導致環境變量重置。因此要使用su -p admin
這樣的方式,才可以繼承先前的環境變量。
我們可以通過help來看下su的相關參數描述。
[root@adworderp-03a38d62-4103555841-m81qk /]# su --help Usage: su [OPTION]... [-] [USER [ARG]...] Change the effective user id and group id to that of USER. ... -m, --preserve-environment do not reset HOME, SHELL, USER, LOGNAME environment variables -p same as -m ...
容器中的亂碼問題
一些業務在遷移到容器中時,常常報告打印日志亂碼。一般的原因是locale沒有配置正確導致。
可以通過locale查看當前容器的語言環境。如果沒設置,一般會是POSIX。我們可以通過locale -a查看當前容器支持的語言環境,而后根據需要進行設置。
要想一勞永逸,最好的方式還是在容器啟動或者鏡像的環境變量中添加LANG={xxx},選擇合適的語言,從而避免因此導致的亂碼問題。
ssh的環境變量問題
容器中啟用sshd,可以方便連接和排障,以及進行一些日常的運維操作。
但是很多用戶進入到容器中卻發現,在docker啟動時候配置的環境變量通過env命令并不能夠正常顯示。
這個的主要原因還是ssh為用戶建立連接的時候會導致環境變量被重置。
這樣導致的最大問題就是通過ssh啟動的容器進程將無法獲取到容器啟動時候配置的環境變量。
了解了原理后,這個問題有個簡單的方法解決。就是可以通過將容器的環境變量重新設置到ssh連接后的session中。
具體的實現方式是,ssh連接后,會自動執行source /etc/profile。
那么我們其實只要在/etc/profile追加幾行代碼,從1號進程獲取容器本身的環境變量,然后循環將環境變量export一下即可。
以下是一個簡單的for循環實現。
for item in `cat /proc/1/environ |tr '\0' '\n'` do export $item done
當然,有更簡潔的命令,就是export $(cat /proc/1/environ |tr '\0' '\n' | xargs),可以實現同樣的效果。
以上是“docker中環境變量使用與常見問題的示例分析”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。