我正在尝试创建一个dockerized symfony应用程序。问题是DI容器在Docker容器构建期间构建,这意味着我无法真正将运行时参数注入其中。到目前为止,我的解决方案是清除容器入口点中的缓存,但我意识到在某些情况下这可能是一个非常繁重的操作,所以我在AppKernel中基于内核的启动函数创建了一个自定义编译函数:
/**
* 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 repo问题中被问到:https://github.com/symfony/symfony/issues/19525
PR到我的自定义存储库:https://github.com/webplates/symfony-standard/pull/42
答案 0 :(得分:0)
这一般无法回答,它完全取决于您使用的捆绑包和更改的参数。例如,如果您的路由依赖于参数(例如,在路由上设置主机),则不足以仅重建容器,需要预热来重建路由。< / p>