2016-08-04 55 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

这不是一般的回答,这完全取决于你使用的包,并且是参数改变。例如,如果路由取决于参数(例如,设置路由上的主机),那么它不是而是就足以仅重建容器,需要预热来重建路由。