2017-06-28 68 views
1

有一個Spring Boot應用程序,我們使用application.yml文件來存儲屬性。我得到了一個任務,讓用戶可以在啓動應用程序時覆蓋某些屬性。考慮到我們已經對我們的應用程序docker-compose文件進行了docker化,我認爲這是非常正確的地方。我發現了一個選項,它的實際工作,env_file:docker-compose覆蓋應用程序屬性

backend: 
    build: 
     context: backend 
     dockerfile: Dockerfile.backend 
    restart: always 
    ports: 
     - 3000:3000 
    env_file: 
     - backend/custom.env 
    volumes: 
     - ../m2_repo:/root/.m2/ 
     - ../{APP_NAME}/data_sources:/backend/data_sources/ 
    links: 
     - database 
    networks: 
     main: 
     aliases: 
      - backend 

這完美地解決了我的任務,所有的鍵值對覆蓋現有的application.yml性能。但是,我有2個問題:

  1. 看來,在我的搬運工,撰寫文件中有多個服務,我需要指定不同的服務,這可能不是很方便單獨env_file。是否有可能爲整個docker-compose文件創建一個共同的env_file?

  2. 我知道,對於docker-compose運行命令,有一個選項-e,我可以把env變量的key = value對。碼頭工人有沒有類似的選擇?我的意思是爲了不使用env_file。

+0

爲什麼1)中的問題?你所有的服務都需要相同的屬性嗎?如果使用一個常見的env_file,是否沒有重疊? –

+0

這不是問題,而是我正在尋找一個選項。我的屬性不重疊,這實際上是我考慮有一個env_file而不是多個文件(每個服務一個) – Viacheslav

回答

0

廣告1:這是不可能的。我也相信這是故意的 - 讓開發人員定義什麼容器可以訪問什麼數據。廣告2:不能,您無法使用運行參數up命令docker-compose(運行docker-compose help up以查看可用運行時參數)提供變量。但是你可以從撰寫文件中定義這些使用environment條款,如:

restart: always 
ports: 
    - 3000:3000 
env_file: 
    - backend/custom.env 
environment: 
    - DB_PASSWORD   # <= #1 
    - APP_ENV=production # <= #2 

即。

  1. 要麼只是一個名稱的環境變量的 - 它的值,然後從主機
  2. 或全部定義帶到創建一個新的容器
內面世

請參閱docs上的environment條款以獲得更多的說明。

爲了覆蓋某些設置,您可以做的另一件事是使用「父」文件組合文件extendDocs on extends clause

遺憾的是,截至目前,使用第3版撰寫文件時extends將無法​​正常工作,但它在這個github issue正在討論,所以希望它也將很快面市:)