手动重新编译Symfony容器

时间:2016-08-04 21:17:44

标签: symfony docker

我正在尝试创建一个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

1 个答案:

答案 0 :(得分:0)

这一般无法回答,它完全取决于您使用的捆绑包和更改的参数。例如,如果您的路由依赖于参数(例如,在路由上设置主机),则足以仅重建容器,需要预热来重建路由。< / p>