2016-08-04 56 views
4

我正在嘗試創建一個dockerized symfony應用程序。問題是DI容器在Docker容器構建期間被構建,這意味着我不能真正將運行時參數注入到它中。到目前爲止,我的解決方案是清除容器入口點處的緩存,但是我意識到在某些情況下這可能是一個相當繁重的操作,所以我在AppKernel中基於內核的啓動函數創建了一個自定義編譯函數:手動重新編譯Symfony容器

/** 
* Recompiles the container without warming up the whole cache. 
* 
* Can be called upon docker container start to inject custom parameters. 
*/ 
public function compile() 
{ 
    // Load class cache 
    if ($this->loadClassCache) { 
     $this->doLoadClassCache($this->loadClassCache[0], $this->loadClassCache[1]); 
    } 

    // Initialize bundles to be able to parse configurations 
    $this->initializeBundles(); 

    $class = $this->getContainerClass(); 
    $cache = new ConfigCache($this->getCacheDir().'/'.$class.'.php', $this->debug); 

    $container = $this->buildContainer(); 
    $container->compile(); 
    $this->dumpContainer($cache, $container, $class, $this->getContainerBaseClass()); 
} 

現在將在每個Docker容器啓動時(在應用程序啓動之前)調用此函數。

這是安全操作嗎?我應該假設緩存加熱器可能依賴於容器參數嗎? (由於我只更改容器參數運行時,所以服務和其他一切應該保持不變)。

原本要求在symfony的回購問題:https://github.com/symfony/symfony/issues/19525

PR到我的自定義庫:https://github.com/webplates/symfony-standard/pull/42

+0

在prod環境中構建容器時,運行緩存是否足夠:clear/cache:warmup?那麼再也不要碰他們了? 我沒有得到你的手動方法和空的緩存目錄之間的區別? – mblaettermann

+0

我的意思是:Symfony在內部也是這樣。爲什麼重新發明輪子? – mblaettermann

+0

緩存清除不是一個好主意,因爲它可能是一個沉重的操作(正如我指出的)。保留緩存目錄爲空或者只是手動刪除構建的容器都會以熱身方式結束。在某些情況下,預熱甚至可能需要一分鐘,這在集裝箱化的基礎設施中是不可接受的。 –

回答

0

這不是一般的回答,這完全取決於你使用的包,並且是參數改變。例如,如果路由取決於參數(例如,設置路由上的主機),那麼它不是而是就足以僅重建容器,需要預熱來重建路由。