도커 컨테이너를 실행한 사용자 식별 방법 연구

개발팀 동료가 사내 서버들의 그래픽 카드 사용 현황을 종합하여 대시보드로 보여주는 프로젝트를 진행하고 있습니다.

대시보드에선 그래픽 카드를 사용하고 있는 프로세스와 해당 프로세스 사용자도 볼 수 있습니다.

https://thefirstfamily.net/wp-content/uploads/2019/10/CMG-Editor-October-1-2019.png

그런데 도커 컨테이너로 실행된 프로세스는 사용자 식별이 불가했습니다.

docker run ... 을 통해 컨테이너를 실행한 후 프로세스 목록을 top 으로 확인하면 아래와 같이 컨테이너 프로세스 정보를 얻을 수 있습니다.

20091 root ... /usr/bin/containerd-shim-runc-v2 -namespace moby -id 13e77f399ec5... 
20114 root ...      `- /bin/bash

여기서 문제는 실제 컨테이너를 실행한 사용자가 아닌 root으로만 사용자가 확인됩니다.

docker psdocker inspect 등을 통해서도 컨테이너를 실행한 사용자명을 얻을 수 없었습니다.

docker run ... 을 실행하는 사용자가 직접 사용자명을 컨테이너 메타 정보에 넣는 방법(환경 변수 또는 라벨)도 있겠지만 실수나 누락을 원천적으로 막을 수 없기 때문에 자동으로 처리되는 방법이 필요했습니다.

그렇다면 docker run ... 을 대신 처리해주는 cli 툴을 만들 수 밖에 없다고 판단했지만 컨테이너를 실행하는 커맨드가 someting run ... 으로 바뀌는 건 원치 않았습니다.

두 가지 사항을 충족시키기 위해 이리저리 고민 끝에 트릭키하지만 간단한 방법을 찾을 수 있었는데 바로 docker 라는 이름을 가진 쉘스크립트를 만들어 활용하는 것입니다.

방법은 다음과 같습니다.

1.아래 코드를 담은 쉘스크립트 파일을 만들고 docker 로 이름을 지정합니다.(실행 퍼미션도 주어야 함)

#!/bin/bash
if [[ "$1" == "run" ]]; then
    shift
    /usr/bin/docker run -l USER=$USER $@
else
    /usr/bin/docker $@
fi

2.이 쉘스크립트 파일을 PATH 환경 변수 상에서 기존 docker 바이너리 파일이 있던 디렉토리보다 앞서 명시된 디렉토리에 넣습니다.

이후 docker 커맨드는 기존 바이너리 파일이 아닌 쉘스크립트 파일을 실행하게 되고 쉘스크립트는 사용자가 입력한 옵션과 더불어 자동으로 사용자명을 컨테이너 라벨로 입력하는 옵션을 추가해 기존 docker 바이너리 파일을 실행시켜줍니다.

이렇게 실행된 컨테이너의 메타 정보를 docker inspect 를 통해 확인해보면 Config.Labels 섹션에서 "USER": "사용자명"을 찾으실 수 있습니다.

위 작업 이후로도 docker 커맨드를 통해 기존 바이너리 파일만 실행된다면 기존 docker 커맨드가 해쉬된 경로를 사용하는 것이 아닌지 확인해 보시길 바랍니다.