8/02/2017

도커 이미지에 볼륨 마운트시 소유권한 문제

Docker 이미지를 VM 이나 기타 환경에서 동작시킬 때 문제 중 하나는, 특정 프로퍼티파일이나 볼륨 마운트를 실시간에 Puppet등으로 docker -v 를 통해서 붙이는 경우의 파일 퍼미션이다. 이를테면 도커 이미지에서 동작하는 톰캣의 UID와 GID가 각각 1200:1200 이런 식이라고 할 때, 볼륨 마운트 시킨 파일의 퍼미션이 위와 같이 일치하지 않거나 최소한 읽기 권한 등이 없으면 파일에 접근할 수가 없다.
이것의 또 다른 문제점은 해당 docker 이미지 내의 UID / GID가 puppet이나 도커 이미지를 실행하는 VM에 의해서 생성된 것이 아니라는 것이다. 
언뜻 생각하기에는 실행하는 VM이 해당 도커 이미지 안으로 로그인하여 파일 소유 권한을 바꿔야 하는 특정 디렉토리에 접근해서 해당 디렉토리/파일의 UID GID를 VM의 것으로 바꾸던지(이런 경우 passwd와 group의 것도 바꿔야 함) 하면 될 것 같지만 이런 경우 immutable environment 라는 컨셉이 깨질 수가 있고( 도커 이미지로 만들어질 때와 그 이후 실행될 때의 상태가 다름), 또한 의도치 않게 도커 이미지 안에서 해당 UID GID로 실행되어야 하는 다른 것들이 있을 경우 그 프로세스들이 접근 퍼미션 문제를 겪을 수가 있다.
또 다른 방법으로는 도커를 실행하는 프로세스가 docker run -t <image name> /bin/bash 등으로 도커 이미지 내부에 들어가서 /etc/password와 /etc/group 등에 접근해서 UID PID를 알아낸 다음 그걸 이용해서 도커에 마운트하는 로컬 볼륨의 소유권한을 바꾸는 방법이 있을 수 있다. 
이것도 뭔가 구리다 싶으면 마지막 방법으로는 그냥 서로 "약속"을 통해서 해당 마운트를 읽어들여야 하는 계정의 UID와 GID를 미리 정해놓는 것이다. 즉 도커 이미지를 생성할 때 추가할 tomcat의 UID GID를 1200으로 미리 맞춰놓고 도커 이미지를 실행하는 VM의 Puppet등이 docker -v 로 마운트하는 볼륨의 소유권한을 죄다 1200:1200으로 바꿔놓는 것이다. 유저명이나 그룹 이름은 매칭할 필요가 없다 어차피 UID GID가 같으면 그냥 같은 애들이니깐.
좀 무식한 것 같지만 사실 마지막 방법이 제일 편하다. -_-;; (퇴근전에 왜 이런 뻘글을 쓰고 있나)
제일 쉬운 방법은 그냥 읽어들여야 하는 내용을 파일에 넣지 말고 어디 데이터베이스나 key/value storage(etcd같은?) Vault 같은 곳에 넣고 읽으면 될 것 같지만.. 그럼에도 볼구하고 파일을 런타임시 마운트해서 읽어야 하는 케이스는 종종 존재한다. 혹시 같은 문제를 겪고 있는 혹은 곧 겪을 분들은 참고하시라.

요즘 포스팅을 모두 medium쪽으로 하고 있습니다

안녕하세요? 어쩌다보니 그냥 한번 써보기로 한 medium.com 에다가 죄다 최근 포스팅을 하고 있습니다. 현재 도메인인 potatosoft.com 은 제가 대학때인가 사회 취업한지 얼마 안됐을때부터 유지해 온 도메인이고, 블로그 시스템은 그...