我們?cè)跒閜hp或前端頁(yè)面打包docker的時(shí)候,有的配置是通過文件寫死的届垫,我們比較難以通過環(huán)境變量去做配置释液。而環(huán)境變量的支持是比較重要的,為了同一個(gè)docker包的可復(fù)用性以及安全性考慮敦腔,很多時(shí)候均澳,我們的配置信息都不能打到docker包里面,比如賬號(hào)密碼的符衔,都需要通過環(huán)境變量配置找前。
我們可以利用bash腳本的功能,把docker的entrypoint換成自定義腳本來做到環(huán)境變量支持判族。
前端的例子
目錄結(jié)構(gòu)
我們有一個(gè)如圖所示的目錄結(jié)構(gòu):
其中躺盛,assets放前端頁(yè)面。
Dockerfile是docker build的配置文件形帮。
docker-entrypoint.sh是新的作為docker包啟動(dòng)運(yùn)行的腳本文件槽惫。
Dockerfile
我們看一下Dockerfile:
FROM?nginx:1.15.7
COPY?assets?/usr/share/nginx/assets
COPY?docker-entrypoint.sh?/usr/local/bin/
RUN?chmod?+x?/usr/local/bin/docker-entrypoint.sh
ENTRYPOINT?["docker-entrypoint.sh"]
CMD?["nginx",?"-g",?"daemon?off;"]
主要做了幾件事:
1. 把a(bǔ)ssets前端頁(yè)面周叮,docker-entrypoint.sh移動(dòng)到nginx鏡像里面。
2. 設(shè)置docker-entrypoint為可執(zhí)行腳本界斜,并設(shè)置其為entrypoint
3. 設(shè)置entrypoint的CMD為啟動(dòng)nginx
入口腳本
我們看一下docker-entrypoint.sh
#!/bin/bash
#?set?-eo?pipefail
declare?-A?PAGE_PARAMS=(
??#?新的環(huán)境變量支持可以添加在這里
??["HOST"]='http://localhost:3300'
??["CDN_HOST"]="http://localhost:3300"
)
for?index?in?"${!PAGE_PARAMS[@]}";
do
??ENV_VAL=`eval?echo?'$'${index}`
??[?-z?"${ENV_VAL}"?]?&&?ENV_VAL=${PAGE_PARAMS[$index]}
??/bin/sed?-i?"s!${index}!${ENV_VAL}!g"?/usr/share/nginx/assets*.html;
done
exec?"$@"
可以看到仿耽,我們定義了一個(gè)關(guān)聯(lián)數(shù)據(jù),可以通過鍵值對(duì)的方式進(jìn)行訪問项贺。
其中HOST, CDN_HOST就是我們支持的環(huán)境變量配置方式了开缎。
可以看到:
1. bash腳本通過eval來拿系統(tǒng)的環(huán)境變量疗认,并把值存到ENV_VAL里面
2. 通過sed命令侮邀,把/usr/share/nginx/assets里面的所有html文件進(jìn)行字符串替換铝宵,既是把環(huán)境變量名稱換成環(huán)境變量的值。
因此侣夷,假如我們?cè)O(shè)置了docker的HOST環(huán)境變量為 https://www.baidu.com, 那么,html文件里的HOST字符串就會(huì)被替換成https://www.baidu.com.
使用環(huán)境變量
我們來看一下html文件:
<!DOCTYPE?html>
<html?lang="en">
<head>
??<meta?charset="UTF-8">
??<meta?name="viewport"?content="width=device-width,?initial-scale=1.0">
??<title>Document</title>
</head>
<body>
??window.host="HOST"
??window.cdnHost="CDN_HOST"
</body>
</html>
假如設(shè)置了HOST, CDN_HOST環(huán)境變量值,代碼里的HOST, CDN_HOST字符串就會(huì)被替換成相應(yīng)的值。
總結(jié)
這樣俊鱼,我們就實(shí)現(xiàn)了前端頁(yè)面對(duì)環(huán)境變量的支持细睡,我們只需要在html文件里適當(dāng)?shù)牡胤绞褂肏OST這個(gè)字符串,并在docker進(jìn)行運(yùn)行的時(shí)候設(shè)置HOST環(huán)境變量的值雁歌,就可以了比庄。
同樣的佳窑,對(duì)于php等文件的配置也是一樣的神凑,只需要對(duì)Dockerfile及docker-entrypoint進(jìn)行相應(yīng)的修改就可以了溉委。