2016-08-04 4 views
4

도킹 된 symfony 응용 프로그램을 만들려고합니다. 문제는 Docker 컨테이너 빌드 중에 DI 컨테이너가 빌드되어 런타임 매개 변수를 실제로 삽입 할 수 없다는 것입니다. 지금까지는 컨테이너 엔트리 포인트에서 캐시를 지우는 것이 해결책 이었지만 어떤 경우 커널의 부팅 기능에 따라 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 컨테이너 시작시 (응용 프로그램 시작 전)에 호출됩니다.

안전한 작업입니까? 캐시 워머가 컨테이너 매개 변수에 의존한다고 가정해야합니까? (컨테이너 매개 변수 런타임 만 변경하기 때문에 서비스와 그 밖의 모든 것이 동일하게 유지되어야합니다).

가 원래 심포니 REPO 문제에 질문 : https://github.com/symfony/symfony/issues/19525

PR 내 사용자 저장소에 : https://github.com/webplates/symfony-standard/pull/42

+0

캐시를 실행하는 것으로 충분하지 않습니까? clear/cache : 환경을 개선 한 환경에서 컨테이너를 빌드 할 때 예열 하시겠습니까? 그런 다음 다시 만지지 마십시오. 수동 접근법과 빈 캐시 디렉토리의 차이점은 무엇입니까? – mblaettermann

+0

내 말은 : Symfony는 내부적으로 똑같습니다. 왜 바퀴를 재발견합니까? – mblaettermann

+0

캐시 지우기는 과중한 조작 일 수 있으므로 (좋은 지적은 아닙니다). 캐시 디렉토리를 비워 두거나 빌드 된 컨테이너를 수동으로 제거하는 것만으로도 워밍업 상태가됩니다. 어떤 경우에는 예열에 1 분이 걸릴 수도 있습니다. 이는 컨테이너 기반 시설에서는 허용되지 않습니다. –

답변

0

이것은 일반적으로 대답 할 수없는, 완전히 사용하는 번들하고있는 매개 변수에 따라 달라집니다 변경되었습니다. 예를 들어 경로가 매개 변수 (예 : 경로에 호스트를 설정)에 따라 달라지는 경우 이 아닌이면 컨테이너를 다시 빌드하기에 충분하므로 라우팅을 다시 작성하려면 워밍업이 필요합니다.

관련 문제