docker內程序如何讀取dockerfile和compose.yml中設置的環境變量
背景
compose文件中配置了服務A和服務B,其中B服務調用了A服務的接口,那么B的實現代碼中該如何調用A的服務呢?
解決
compose文件中,服務B的配置加入A的接口,B的實現代碼中調用此接口即可;yml文件如下:
a:image: nlp:1.1environment:PROCESS_NUM: 1deploy:replicas: 1networks:- cdb:image: debug:1.1environment:PROCESS_NUM: 1a_host: "a"a_port: 8080deploy:replicas: 1networks:- cdports:- "50370:50370"depends_on:- a
服務B的實現代碼中,請求服務A的接口地址寫為:
a_host:a_port
相當于curl a_host:a_port
的效果,具體的調用詳情根據語言決定
解釋
實際上dockerfile和yml文件的配置方式是一樣的;起初不理解,隨后考慮了一下,大概理解如下:
- yml和dockerfile中的environment/ENV就相當于一個環境變量,再底層一些來講,相當于系統的一個環境變量,服務啟動的時候變量就存在了;若想用這個變量,去系統中讀取就可以了,比如Python:
import os
os.environ.get('a_host', 'a_host')
- yml中的定義方式如上,他的實現方式實際上就和DNS一樣;當你定義的這些服務在同一個子網的時候,服務的名稱就相當于其域名,直接調用服務名就可以調用這個服務的接口;也就是說:知道了服務名,就知道了服務的地址;期間不用你做額外的操作