새로운 서비스 릴리즈를 준비하고 있는데, 도커를 이용하고 점진 적으로 기존 레거시 앱들도 도커로 전환할 계획을 가지고 있습니다. 기존 레거시 앱들이 호스트에서 구동되기 때문에 호스트의 파일 시스템 일부를 볼륨으로 지정하여 앱 사이의 데이터를 공유하고 있습니다. 이를 위해서 호스트의 계정과 컨테이너에서 구동되는 계정의 uid를 일치하도록 했습니다. 개발서버에서 문제 없이 구동했고, 이제 릴리즈 일정이 다가옴에 따라 스테이지 서버와 운영서버에 배포를 시작했는데, 문제가 생겼습니다.
스테이지 서버와 운영 서버는 최근에 받은 서버이고, 운영 주체가 다릅니다. 그래서 개발서버와 달리 직접 컨트롤 할 수가 없습니다. 여기서 문제가 발생했는데, 스테이지 서버와 운영 서버에서 발급 받은 계정의 uid가 기존에 사용하던 것과 달랐고, 기존에 사용하던 uid는 서버의 운영주체에서 서버 관리용 계정에 할당되어 있어 변경이 불가 하다는 통보를 받았습니다.
서비스가 릴리즈될 서버의 uid를 먼저 확인하지 않은 잘못이 크지만, 일단 급히 해결해야 했고, 운영용 이미지를 구별하여 빌드하는 안과, 개발서버의 계정 uid를 운영서버와 동일하게 변경하는 안이 나왔고 첫번째 안은, 운영서버용 이미지와 개발서버의 이미지를 분리하여 빌드하는 안은 도커를 이용하여 관리를 편하게 하자는 취지에 어긋나고, 개발서버 계정의 uid를 변경하는 것은 모든 파일의 권한을 변경해야 하므로 잘 구동되는 서버에 어떤 부작용이 발생할지도 모른다는 염려가 있었습니다. 결국엔 개발서버의 계정의 uid를 변경하는 것으로 결정이 났습니다.
일단 사용자의 uid를 변경했습니다. ( uid로 변경할 때는 해당 계정으로 실행되는 프로세스가 없어야 하므로 다른 계정으로 로그인하여 합니다. )
# su -
root # usermod -u 501 bitlog
이후에 파일의 기존 계정의 uid(1000)가 소유하고 있는 파일을 새로운 uid(501)로 소유권을 변경해 줘야하는데, 홈 디렉토리 하위의 의 모든 파일을 변경해 준다면 다른 계정으로부터 만들어진 파일들의 권한이 틀어질 수 있는 위험이 있기 때문에 정확하게 찾아서 변경해 줘야 합니다.
$ sudo chown -h bitlog /home/bitlog/ -R
예를 들어보면 mysql 컨테이너로 생성된 볼륨은 uid 999, gid 999를 가지게 되는데, 이게 uid 501로 변경이 되게 되므로 mysql 컨테이너는 더이상 데이터를 쓰지 못하는 상황이 발생하게 됩니다.
그래서 정확히 uid 1000이 소유하고 있는 파일들을 찾아야 합니다. find 명령을 통해서 가능하고 -user 라는 옵션으로 할 수 있습니다.
$ sudo find / -user 1000
그런데 찾는 것만 아니라 파일 소유자로 변경해 줘야 하므로 -exec 옵션도 추가해서 한번에 권한도 바꿔 줍니다.
$ find / -user 1000 -exec chown -h bitlog '{}' \;
find의 결과가 차례로 {}로 전달 되고 exec 다음의 명령이 실행되게 됩니다. 그래서 uid 1000이 소유한 파일을 찾아 하나씩 bitlog 계정으로 변경하게 되는 것이죠. 이렇게 해서 부작용 없이 uid를 변경할 수 있었습니다.
생각보다 쉽게 끝났는데요. 요걸 조금 이용해보면, 다음과 같이 활용할 수도 있을 것 같습니다.
- 특정 이름을 포함한 파일을 복사
$ find / -name '*.txt' -exec cp '{}' textfile_folder \;
- 특정 사용자가 작성한 파일 목록을 작성.
$ find / -name '*.txt' -exec print '{}' \;
- 특정 파일에서 문자열 검색
$ find / -name '*.txt' -exec grep 'string' '{}' \;
- 특정 파일의 라인수 출력
find . -name '*.txt' -exec wc -l '{}' \;
이제 까지 단순히 파일명, 폴더명 검색에만 사용했는데, exec 옵션을 이용하면 더욱 강력한 기능을 가진 명령이 되는 것 같습니다.