도킹 된 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
캐시를 실행하는 것으로 충분하지 않습니까? clear/cache : 환경을 개선 한 환경에서 컨테이너를 빌드 할 때 예열 하시겠습니까? 그런 다음 다시 만지지 마십시오. 수동 접근법과 빈 캐시 디렉토리의 차이점은 무엇입니까? – mblaettermann
내 말은 : Symfony는 내부적으로 똑같습니다. 왜 바퀴를 재발견합니까? – mblaettermann
캐시 지우기는 과중한 조작 일 수 있으므로 (좋은 지적은 아닙니다). 캐시 디렉토리를 비워 두거나 빌드 된 컨테이너를 수동으로 제거하는 것만으로도 워밍업 상태가됩니다. 어떤 경우에는 예열에 1 분이 걸릴 수도 있습니다. 이는 컨테이너 기반 시설에서는 허용되지 않습니다. –