Docker의 /var/run 지속성

Docker의 /var/run 지속성

방금 다음과 같이 구성된 (Debian) Docker 컨테이너의 PID 파일에 문제가 발생했습니다.--restart always

문제를 요약해 보세요.

  1. apache2컨테이너에서 서비스를 시작합니다. init 서비스는 PID 파일을 생성합니다./var/run/apache2/apache2.pid
  2. docker kill컨테이너가 호스트의 부적절한 종료(전기적 고장)를 시뮬레이션했고, 서비스가 비정상적으로 종료되었으므로 PID 파일이 여전히 존재했습니다.
  3. 컨테이너를 다시 시작하고(호스트 다시 시작 시뮬레이션) apache2서비스를 다시 시작해 보았습니다. PID가 재사용되는 경우(다른 프로그램이 httpd가 실행 중인 PID를 사용하는 경우) 서비스 시작이 실패합니다.

서비스를 올바르게 시작하려면 다음을 수행해야 합니다.

  1. 운이 좋다면 재활용된 PID가 공개될 것입니다.
  2. PID 파일을 수동으로 삭제

분명히 솔루션 1은 솔루션이 아닙니다.

솔루션 2는 여러 번 언급되었지만 컨테이너에서 시작하는 모든 서비스에 대해 진입점 또는 cmd에서 이 작업을 수행하는 것과 관련되어 있기 때문에 제 생각에는 솔루션이 아닙니다. 또한 특정 이미지가 PID 파일을 사용하지만 가정이 정확하지 않을 수도 있다는 것도 알고 있습니다.

몇 가지 개선 사항을 볼 수 있습니다.

  1. /var/run휘발성(tmpfs)이거나 OS 시작 시 정리되어 컨테이너 시작 시 모든 것을 rm할 수 있습니다(이미 특정 PID 파일을 삭제하는 것보다 낫습니다).
  2. /var/run다음으로 설치됨임시 파일 시스템컨테이너가 시작될 때 정리되도록 컨테이너를 생성할 때

tmpfs 솔루션은 저에게 완벽하게 작동하는 것 같습니다(정말요?). 따라서 이를 모든 컨테이너 배포(docker, docker compose 등)에 적용할 수 있는 체계적인 솔루션이 있는지 또는 단점이 있는지 궁금합니다. 매번? 왜냐하면 내 생각에는 이것을 모든 컨테이너 배포에 영원히 적용해야 하고 가능하다면 명시적으로 이 작업을 수행하고 싶지 않기 때문입니다.

관련 정보