promtail docker 컨테이너 내부에 접속하여 로그 수집 대상 디렉토리를 확인하였을 때, 로그 파일이 존재하지 않음을 확인
/logs
경로에 생성/var/app/current
에 생성됨
이로 인해 배포 이후 서버의 로그 파일 경로는 /var/app/current/logs
해당 경로를 도커 컨테이너에 바인드 마운트로그 파일이 존재하지 않는 원인을 찾기 위해 EB 배포 과정의 로그를 확인할 수 있는 eb-engine.log 확인 후 해당 로그 식별
배포 시 EB의 롤링 정책에 의해 새로운 인스턴가 매번 생성되는 상황에서 promtail 컨테이너가 항상 동작해야 하기 때문에 .ebextension 경로의 스크립트를 통해 promtail 도커 컨테이너를 실행하는 과정에서 서버 동작 이전에 미리 /var/app/current/logs
를 바인드 마운트 하여 실행하는 방식으로 구성해둔 상황
도커 컨테이너에 바인드 마운트 된 이후 마운트 대상이었던 호스트 디렉토리가 eb에 의해 삭제 후 재생성 될 경우 도커 컨테이너가 호스트 디렉토리를 인식 못하는 상황 의심
도커 바인드 마운트 로직 확인
도커의 바인드 마운트는 자체 라이브러리인 libcontainer에서 구현
linux 시스템 콜인 mount
콜을 사용
// runc/libcontainer/mount_linux.go
// mount is a simple unix.Mount wrapper, returning an error with more context
// in case it failed.
func mount (source, target, fstype string, flags uintptr, data string) error 1
return mountViaFds (source, nil, target, "', fstype, flags, data)
linux는 파일을 inode라는 고유한 파일 메타데이터를 통해 파일을 탐색 및 식별
컨테이너가 작동 한 이후 시점에 기존에 바인드 마운트 되었던 호스트 디렉토리가 재생성 될 경우 해당 디렉토리의 inode가 변경되어 바인드 마운트 시 새로운 호스트 디렉토리를 인식하지 못해 제대로 동작하지 않음으로 가정하고 문제 해결 시도