docker中的環(huán)境變量使用與常見(jiàn)問(wèn)題解決方案
docker可以為容器配置環(huán)境變量。配置的途徑有兩種:
- 在制作鏡像時(shí),通過(guò)ENV命令為鏡像增加環(huán)境變量。在容器啟動(dòng)時(shí)使用該環(huán)境變量。
- 在容器啟動(dòng)時(shí)候,通過(guò)參數(shù)配置環(huán)境變量,如果與鏡像中有重復(fù)的環(huán)境變量,會(huì)覆蓋鏡像的環(huán)境變量。
使用docker exec {containerID} env即可查看容器中生效的環(huán)境變量。
[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 ...
容器啟動(dòng)的進(jìn)程,也就是ENTRYPOINT+CMD中,可以通過(guò)相應(yīng)的系統(tǒng)庫(kù)獲取容器的環(huán)境變量。
進(jìn)入到容器中,查看進(jìn)程的環(huán)境變量,可以通過(guò)/proc下進(jìn)行查看。
cat /proc/{pid}/environ
因此,容器中的環(huán)境變量也可以通過(guò)在容器中查看1號(hào)進(jìn)程的環(huán)境變量來(lái)獲取??梢酝ㄟ^(guò)執(zhí)行cat /proc/1/environ |tr '\0' '\n'命令進(jì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 ...
一般來(lái)說(shuō),從父進(jìn)程產(chǎn)生出來(lái)的子進(jìn)程都會(huì)默認(rèn)繼承父進(jìn)程的環(huán)境變量。因此容器中的各個(gè)進(jìn)程的環(huán)境變量應(yīng)該是大致相同的。當(dāng)然,在一些特殊的情況下,環(huán)境變量也會(huì)被重置,導(dǎo)致產(chǎn)生一些誤解和問(wèn)題。下面就對(duì)容器中一些常見(jiàn)的情況進(jìn)行相關(guān)講解。
常見(jiàn)問(wèn)題及解決
切換不同用戶后環(huán)境變量消失
在容器中,啟動(dòng)后切換不同用戶,比如使用su - admin切換admin用戶后,發(fā)現(xiàn)配置的容器環(huán)境變量丟失了。
這是因?yàn)榍袚Q用戶會(huì)導(dǎo)致環(huán)境變量重置。因此要使用su -p admin這樣的方式,才可以繼承先前的環(huán)境變量。
我們可以通過(guò)help來(lái)看下su的相關(guān)參數(shù)描述。
[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
...
容器中的亂碼問(wèn)題
一些業(yè)務(wù)在遷移到容器中時(shí),常常報(bào)告打印日志亂碼。一般的原因是locale沒(méi)有配置正確導(dǎo)致。
可以通過(guò)locale查看當(dāng)前容器的語(yǔ)言環(huán)境。如果沒(méi)設(shè)置,一般會(huì)是POSIX。我們可以通過(guò)locale -a查看當(dāng)前容器支持的語(yǔ)言環(huán)境,而后根據(jù)需要進(jìn)行設(shè)置。
要想一勞永逸,最好的方式還是在容器啟動(dòng)或者鏡像的環(huán)境變量中添加LANG={xxx},選擇合適的語(yǔ)言,從而避免因此導(dǎo)致的亂碼問(wèn)題。
ssh的環(huán)境變量問(wèn)題
容器中啟用sshd,可以方便連接和排障,以及進(jìn)行一些日常的運(yùn)維操作。
但是很多用戶進(jìn)入到容器中卻發(fā)現(xiàn),在docker啟動(dòng)時(shí)候配置的環(huán)境變量通過(guò)env命令并不能夠正常顯示。
這個(gè)的主要原因還是ssh為用戶建立連接的時(shí)候會(huì)導(dǎo)致環(huán)境變量被重置。
這樣導(dǎo)致的最大問(wèn)題就是通過(guò)ssh啟動(dòng)的容器進(jìn)程將無(wú)法獲取到容器啟動(dòng)時(shí)候配置的環(huán)境變量。
了解了原理后,這個(gè)問(wèn)題有個(gè)簡(jiǎn)單的方法解決。就是可以通過(guò)將容器的環(huán)境變量重新設(shè)置到ssh連接后的session中。
具體的實(shí)現(xiàn)方式是,ssh連接后,會(huì)自動(dòng)執(zhí)行source /etc/profile。
那么我們其實(shí)只要在/etc/profile追加幾行代碼,從1號(hào)進(jìn)程獲取容器本身的環(huán)境變量,然后循環(huán)將環(huán)境變量export一下即可。
以下是一個(gè)簡(jiǎn)單的for循環(huán)實(shí)現(xiàn)。
for item in `cat /proc/1/environ |tr '\0' '\n'` do export $item done
當(dāng)然,有更簡(jiǎn)潔的命令,就是export $(cat /proc/1/environ |tr '\0' '\n' | xargs),可以實(shí)現(xiàn)同樣的效果。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)本站的支持。
版權(quán)聲明:本站文章來(lái)源標(biāo)注為YINGSOO的內(nèi)容版權(quán)均為本站所有,歡迎引用、轉(zhuǎn)載,請(qǐng)保持原文完整并注明來(lái)源及原文鏈接。禁止復(fù)制或仿造本網(wǎng)站,禁止在非maisonbaluchon.cn所屬的服務(wù)器上建立鏡像,否則將依法追究法律責(zé)任。本站部分內(nèi)容來(lái)源于網(wǎng)友推薦、互聯(lián)網(wǎng)收集整理而來(lái),僅供學(xué)習(xí)參考,不代表本站立場(chǎng),如有內(nèi)容涉嫌侵權(quán),請(qǐng)聯(lián)系alex-e#qq.com處理。
關(guān)注官方微信