Docker 學(xué)習(xí)系列6 Docker Compose 中的環(huán)境變量使用注意事項

學(xué)習(xí)技能光看不做是不行的,強烈推薦按照教程敲一遍
https://docs.docker.com/compose/gettingstarted/

Compose項目由 Python編寫 ,實現(xiàn)上調(diào)用了 Docker服務(wù)提供的 API來對容器進行管理丹鸿。 因此只要所操作的平臺支持 Docker,就可以在其上利用 Compose來進行編排管理碎罚。

本人提煉出了幾點技巧:

1. 多用 docker-compose config

命令校驗和查看配置信息荐吵,
當修改了docker-compose.yml文件,不要急于執(zhí)行docker-compose up啟動秉宿,可以先檢查下配置。很多時候是yml格式不規(guī)范導(dǎo)致的屯碴。

2. docker-compose up

docker-compose up 包含了構(gòu)建鏡像描睦,創(chuàng)建服務(wù),啟動服務(wù)等一系列操作导而。一般配好文件執(zhí)行這個命令就可以了忱叭。

3. 使用.env環(huán)境變量配置文件

一些敏感信息如,數(shù)據(jù)庫密碼等不建議寫死到docker-compose.yml中今艺,可以寫在.env環(huán)境配置文件中(使用Laravel的同學(xué)對這個文件肯定不陌生)韵丑。
因為docker-compose.yml一般跟隨項目受版本控制,.env可以不受版本控制虚缎。
優(yōu)化前:
docker-compose.yml

  mysql:
      build: ./docker-build/mysql
      ports:
        - "33060:3306"
      volumes:
        - ./docker-build/mysql/data:/var/lib/mysql
      environment:
        MYSQL_ROOT_PASSWORD: 123456

優(yōu)化后:
同級目錄建立.env文件

  mysql:
      build: ./docker-build/mysql
      ports:
        - "33060:3306"
      volumes:
        - ./docker-build/mysql/data:/var/lib/mysql
      environment:
       # 先從.env找DOCKER_MYSQL_PASSPORD撵彻,找不到使用后面的默認值
        MYSQL_ROOT_PASSWORD: ${DOCKER_MYSQL_PASSPORD-123456}

.env

# define env var default value.
DOCKER_MYSQL_PASSPORD=root
4. 使用docker-compose.yml中的env_file語法

service節(jié)點下支持 env_file屬性,即環(huán)境變量從額外的文件中讀取实牡。
如下面的例子陌僵,如果local.env和common.env有相同key。則下面的優(yōu)先級高创坞。

  php:
      build:
        context: ./docker-build/php
        args:
          - INSTALL_COMPOSER=${PHP_INSTALL_COMPOSER}
          - INSTALL_MONGO=${PHP_INSTALL_MONGO}
          - INSTALL_REDIS=${PHP_INSTALL_REDIS}
          - INSTALL_XDEBUG=${PHP_INSTALL_XDEBUG}
      ports:
        - "9001:9000"
      links:
        - "mysql"
      volumes:
        - .:/www
      env_file:
        - ./common.env
        - ./local.env

假設(shè) local.env 中內(nèi)容是A:1拾弃,common.env 是 A:2

      environment:
        A: 3
      env_file:
        - ./common.env
        - ./local.env

最終生效的是 A:3

5. 配置不同場景下的環(huán)境變量

我們可以把不同場景下的環(huán)境變量定義在不同的 shell 腳本中并導(dǎo)出,然后在執(zhí)行 docker-compose 命令前先執(zhí)行 source 命令把 shell 腳本中定義的環(huán)境變量導(dǎo)出到當前的 shell 中摆霉。通過這樣的方式可以減少維護環(huán)境變量的地方豪椿,下面的例子中我們分別在 docker-compose.yml 文件所在的目錄創(chuàng)建 test.sh 和 prod.sh奔坟,test.sh 的內(nèi)容如下:

#!/bin/bash
# define env var default value.
export IMAGETAG=web:v1
export APPNAME=HelloWorld
export AUTHOR=Nick Li
export VERSION=1.0

prod.sh 的內(nèi)容如下:

#!/bin/bash
# define env var default value.
export IMAGETAG=webpord:v1
export APPNAME=HelloWorldProd
export AUTHOR=Nick Li
export VERSION=1.0LTS

在測試環(huán)境下,執(zhí)行下面的命令:

$ source test.sh
$ docker-compose config
image.png

此時 docker-compose.yml 中的環(huán)境變量應(yīng)用的都是測試環(huán)境相關(guān)的設(shè)置搭盾。
而在生產(chǎn)環(huán)境下咳秉,執(zhí)行下面的命令:

image.png

此時 docker-compose.yml 中的環(huán)境變量應(yīng)用的都是生產(chǎn)環(huán)境相關(guān)的設(shè)置。

6. 環(huán)境變量的優(yōu)先級

docker-compose.yml 文件中引用的環(huán)境變量鸯隅,它們的優(yōu)先級如下:

  • Compose file
  • Shell environment variables
  • Environment file
  • Dockerfile
  • Variable is not defined

首先澜建,在 docker-compose.yml 文件中直接設(shè)置的值優(yōu)先級是最高的。
然后是在當前 shell 中 export 的環(huán)境變量值蝌以。
接下來是在環(huán)境變量文件中定義的值炕舵。
再接下來是在 Dockerfile 中定義的值。
最后還沒有找到相關(guān)的環(huán)境變量就認為該環(huán)境變量沒有被定義跟畅。

額外內(nèi)容咽筋,使用 extends 繼承擴展docker-compose.yml

基于其他模板文件進行擴展 。 例如徊件,我們已經(jīng)有了一個 webapp 服務(wù)奸攻,定義一個基礎(chǔ)模板文件為 common.yml,如下所示:
common.yml:

webapp
  build : . /webapp 
  environment:
    - DEBUG=false
    - SEND EMAILS=false

再編寫一個新的 development .yml 文件虱痕,使用 common.yml 中的 webapp 服務(wù)進行擴展:

development .yml:

web:
  extends:
    file: common .yml
    service: webapp 
    ports :
      - "8000:8000" 
    links:
      - db environment:
      - DEBUG=true 
  db:
    image : postgres

后者會自動繼承common.yml中的webapp服務(wù)及環(huán)境變量定義睹耐。 使用extends需要注意以下兩點:

  • 要避免出現(xiàn)循環(huán)依賴,例如 A 依賴 B, B 依賴 C, C 反過來依賴 A 的情況 部翘。
  • extends 不會繼承 links 和 volumes_from 中定義的容器和數(shù)據(jù)卷資源 硝训。 一般情況下,推薦在基礎(chǔ)模板中只定義一些可以共享的鏡像和環(huán)境變量新思,在擴展模板中
    具體指定應(yīng)用變量捎迫、鏈接、數(shù)據(jù)卷等信息 表牢。

額外內(nèi)容

RUN vs CMD vs ENTRYPOINT 的區(qū)別

  1. Dockerfile中,在基礎(chǔ)鏡像上安裝軟件使用 RUN
  2. CMD命令是當Docker鏡像被啟動后Docker容器將會默認執(zhí)行的命令贝次。一個Dockerfile中只能有一個CMD命令崔兴。通過執(zhí)行docker run $image $other_command啟動鏡像可以重載CMD命令。
  3. 使用 docker-compose run 命令可以在服務(wù)上運行一次性命令蛔翅,如 docker-compose run web env 查看服務(wù)為web的環(huán)境變量
image.png

參考:

https://www.cnblogs.com/sparkdev/p/9826520.html
https://docs.docker.com/compose/reference/envvars/
https://docs.docker.com/compose/environment-variables/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末敲茄,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子山析,更是在濱河造成了極大的恐慌堰燎,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件笋轨,死亡現(xiàn)場離奇詭異秆剪,居然都是意外死亡赊淑,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進店門仅讽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來陶缺,“玉大人,你說我怎么就攤上這事洁灵”グ叮” “怎么了?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵徽千,是天一觀的道長苫费。 經(jīng)常有香客問我,道長双抽,這世上最難降的妖魔是什么百框? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮荠诬,結(jié)果婚禮上琅翻,老公的妹妹穿的比我還像新娘。我一直安慰自己柑贞,他們只是感情好方椎,可當我...
    茶點故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著钧嘶,像睡著了一般棠众。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上有决,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天闸拿,我揣著相機與錄音,去河邊找鬼书幕。 笑死新荤,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的台汇。 我是一名探鬼主播苛骨,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼苟呐!你這毒婦竟也來了痒芝?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤牵素,失蹤者是張志新(化名)和其女友劉穎严衬,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體笆呆,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡请琳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年粱挡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片单起。...
    茶點故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡抱怔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出嘀倒,到底是詐尸還是另有隱情屈留,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布测蘑,位于F島的核電站灌危,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碳胳。R本人自食惡果不足惜勇蝙,卻給世界環(huán)境...
    茶點故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望挨约。 院中可真熱鬧味混,春花似錦、人聲如沸诫惭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽夕土。三九已至馆衔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間怨绣,已是汗流浹背角溃。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留篮撑,地道東北人减细。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像赢笨,于是被迫代替她去往敵國和親未蝌。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容