簡體   English   中英

如何根據從docker-compose.yml傳遞的環境變量來修改Dockerfile RUN命令的效果

[英]How to modify the effect of a Dockerfile RUN command based on an environment variable, passed from docker-compose.yml

總而言之,我的項目包括:

  • /docker-compose.yml
  • / backend / Dockerfile(“后端”服務的Docker文件,一個Yii2 REST API)
  • /backend/.env(未版本化)
  • / frontend / Dockerfile(“前端”服務的Docker文件,一個Angular2應用)
  • /frontend/.env(未版本控制)

因此,在主docker-compose.yml中聲明了2個服務,它們各自具有自己的(非版本化).env文件,在此,我聲明了特定於給定服務的“特定於環境的”參數。 例如,對於后端服務,我定義了數據庫用戶名/密碼; 對於前端服務,我聲明了REST API URL,前端應通過REST API URL通過Ajax檢索其數據。

我正在使用env_file參數通過主docker-compose.yml將env_file傳遞給后端服務,並將/frontend/.env傳遞給前端服務。

兩種服務都托管在不同的域(example.com和api.example.com)上。

鑒於Angular 2如何處理其配置,您不能聲明OS級環境變量,而應讓Angular在應用程序內部的運行時使用它們(例如,從env變量中讀取“ BACKEND_URL”並對其進行Ajax調用)。 相反,它希望在構建過程中所有環境參數都在一個名為/src/app/environment.prod.ts的文件中。 我設法通過/ frontend / Dockerfile中的RUN命令創建了此配置文件,但是我在用未版本化/frontend/.env中聲明的動態值填充該文件時遇到了麻煩。 我不想在/ frontend / Dockerfile中對內容進行硬編碼。

一旦/ frontend / Dockerfile生成具有正確值(例如BACKEND_URL=http://api.example.com )的靜態/src/app/environment.prod.ts,那么其余的構建過程就可以了,並且前端應用程序將獲取這些值。

正如您已經指出的那樣,問題在於docker compose中的environment / env_file聲明適用於RUN而不是構建。 要將參數從docker-compose傳遞到docker build,您必須在Dockerfile中指定ARGS,如此處所述 然后,您可以在預定義的ARGS通過從撰寫文件,如這里

但是,我覺得這種方法引入了太多的耦合和重復的聲明。 我更傾向於將環境定義分成單獨的文件的方法。

除了已經擁有的內容外,您只需要為各個容器定義一個入口點外殼腳本,這些腳本就可以使用環境變量,並在應用程序啟動之前生成角度環境綁定environment.prod.ts

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM