방금 다음과 같이 구성된 (Debian) Docker 컨테이너의 PID 파일에 문제가 발생했습니다.--restart always
문제를 요약해 보세요.
apache2
컨테이너에서 서비스를 시작합니다. init 서비스는 PID 파일을 생성합니다./var/run/apache2/apache2.pid
- 내
docker kill
컨테이너가 호스트의 부적절한 종료(전기적 고장)를 시뮬레이션했고, 서비스가 비정상적으로 종료되었으므로 PID 파일이 여전히 존재했습니다. - 컨테이너를 다시 시작하고(호스트 다시 시작 시뮬레이션)
apache2
서비스를 다시 시작해 보았습니다. PID가 재사용되는 경우(다른 프로그램이 httpd가 실행 중인 PID를 사용하는 경우) 서비스 시작이 실패합니다.
서비스를 올바르게 시작하려면 다음을 수행해야 합니다.
- 운이 좋다면 재활용된 PID가 공개될 것입니다.
- PID 파일을 수동으로 삭제
분명히 솔루션 1은 솔루션이 아닙니다.
솔루션 2는 여러 번 언급되었지만 컨테이너에서 시작하는 모든 서비스에 대해 진입점 또는 cmd에서 이 작업을 수행하는 것과 관련되어 있기 때문에 제 생각에는 솔루션이 아닙니다. 또한 특정 이미지가 PID 파일을 사용하지만 가정이 정확하지 않을 수도 있다는 것도 알고 있습니다.
몇 가지 개선 사항을 볼 수 있습니다.
/var/run
휘발성(tmpfs)이거나 OS 시작 시 정리되어 컨테이너 시작 시 모든 것을 rm할 수 있습니다(이미 특정 PID 파일을 삭제하는 것보다 낫습니다)./var/run
다음으로 설치됨임시 파일 시스템컨테이너가 시작될 때 정리되도록 컨테이너를 생성할 때
tmpfs 솔루션은 저에게 완벽하게 작동하는 것 같습니다(정말요?). 따라서 이를 모든 컨테이너 배포(docker, docker compose 등)에 적용할 수 있는 체계적인 솔루션이 있는지 또는 단점이 있는지 궁금합니다. 매번? 왜냐하면 내 생각에는 이것을 모든 컨테이너 배포에 영원히 적용해야 하고 가능하다면 명시적으로 이 작업을 수행하고 싶지 않기 때문입니다.