docker 에서 mount 명령어를 왜 쓰는가?
여러 플랫폼을 크로스 컴파일을 하다보면, 여러가지 빌드 환경이 필요하다.
여러 시스템을 개발하다보면, 빌드 시스템에 따라 요구사항에 따라 여러 OS버젼 (
ubnutu 18.04
/ubnutu 20.04
등등..), 다양한 시스템 모듈 및 패키지, 여러 locale 등등 각각 다른 환경이 필요하다
이럴때는 역시 빌드용 docker 를 만들어서 각각 분리된 빌드시스템을 구성하는것이 가장 간편하고 빠르다.
크로스컴파일 빌드시스템의 경우 rootfs
를 만드는 과정에서 mount
명령어들을 사용하는 경우가 있다. 애써 각 빌드시스템에 맞게 컨테이너를 분리하였으나, mount
명령어 때문에 다시 host 환경에서만 rootfs 를 만드드는것은 컨셉에 맞지않다.
컨테이너 안에서 mount
명령어등의 특정 host 명령어를 쓰는방법을 정리한다.
각종 시스템명령을 위한 docker container 권한설정
컨테이너의 system admin 권한을 풀어주면 각종 시스템명령어들을 사용할 수 있다.
위의 문서 Runtime privilege and Linux capabilities
의 내용을 보면, host 시스템에서 사용하던 명령이나 시스템 변경 권한등을 풀수다.
- 아무 옵션을 주지 않고 컨테이너를 생성하면 위의 시스템권한 없이 실행된다.
- 만약 위의 각종 시스템권한을 부여한경우 컨테이너 안에서 host system 에 대한 내용을 변경 할 수있으므로, 특정상황이 아니면 권한을 부여하지 않는것이 옳다.
크로스 컴파일을 위한 각종 시스템명령어(ex, mount
)는 --cap-add SYS_ADMIN
, --privileged
권한과 관련이 있다.
- SYS_ADMIN : Perform a range of system administration operations.
privileged
container is given access to all devices
즉, 컨테이너 생성시 위의 권한을 명시해주면 된다. docker-compose.yml 파일에 권한이 필요한 컨테이너설정부분에 다음의 내용을 추가한다.
privileged: true
cap_add:
- SYS_ADMIN
컨테이너를 재생성, 재동작하면 이제 mount
명령어등의 시스템 명령어를 사용할 수 있다.
특이사항
--cap-add SYS_ADMIN
만 설정할 경우 컨테이너 안에서 mount
명령어는 실행이 되나 권한이 없다며 동작이 되지 않는다.
이유는, selinux / apparmer 쪽 에서 권한 설정으로 막기때문이다. 이러한 권한을 풀기 위해서 --privileged
옵션을 함께 줘서 실행하는것이다.
...
- 해당 포스팅은 tistory-posting-cli 를 이용해 발행되었습니다.