SW 개발

docker cotainer 내에서 mount 명령어 사용하기

. . . 2022. 8. 24. 12:36
반응형

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 옵션을 함께 줘서 실행하는것이다.

...

반응형