TL;DR

SELinux 를 쓰고 있는데 dockerpodman 에 연결한 볼륨에 write 에러가 난다면 volume 의 file context 를 container_file_t 로 변경해 주면 됩니다.


예로 /var/local/mysql 를 MySQL 컨테이너에 볼륨으로 연결했다면 다음 명령을 실행합니다.

$ sudo semanage fcontext -a  -t container_file_t '/var/local/mysql(/.*)?'
$ sudo restorecon -R /var/local/mysql
BASH



Label

A secure lock.

출처: https://opensource.com/article/18/2/understanding-selinux-labels-container-runtimes


dockerpodman 같은 컨테이너 런타임을 더 안전하게 구동하기 위해 SELinux 에는 새로운 label 이 많이 추가되었습니다.

container_runtime_exec_t

docker 나 podman 에는 container_runtime_exec_t 레이블이 할당되어 있습니다.

$ ls -lZ `which docker`

-rwxr-xr-x. 1 root root system_u:object_r:container_runtime_exec_t:s0 163 Sep 23 16:25 /usr/bin/docker
BASH
$  ls -lZ `which podman`

-rwxr-xr-x. 1 root root system_u:object_r:container_runtime_exec_t:s0 52909504 Sep 23 16:21 /usr/bin/podman
BASH

container_runtime_exec_t 는 실행시에 container_t 도메인으로 전환되며 아래와 같은 레이블에 접근 가능합니다.


container_var_lib_t

/var/lib/containers/ 는 container_var_lib_t 레이블이 부여되어 있으며 container_t 도메인은 읽고 실행할 수 있습니다.

쓰기는 금지되는데 컨테이너 overlay 이미지등이 저장되어 있으므로 컨테이너에서 직접 수정하면 문제가 되기때문입니다.


container_var_lib_t 는  Web Server 가 읽고 실행할 수 있는 httpd_sys_content_t와 비슷하다고 보면 됩니다.

$ ls -lZd /var/lib/containers/

drwxr-xr-x. 5 root root system_u:object_r:container_var_lib_t:s0 50 Nov 17 03:13 /var/lib/containers/
BASH


container_file_t

컨테이너에서 쓰기 가능한 레이블로 httpd_sys_content_t 와 httpd_sys_rw_content_t 의 관계와 비슷하다고 보시면 됩니다.

container 와 공유해야 하는 볼륨(volume) 같은 persistent storage 가 있을 경우 SELinux 에서 문제가 없으려면 container_file_t 를 할당해 줘야 합니다.

예로 /var/local/mysql 라는 폴더를 만들고 MySQL container 에 volume 으로 연결할 경우 아래와 같이 semanage로 file context 를 설정해 줍니다.

$ sudo semanage fcontext -a  -t container_file_t '/var/local/mysql(/.*)?'
BASH


이미 폴더를 만들었다면 다음 명령어로 context 를 변경해 주면 됩니다.

$ sudo restorecon -R /var/local/mysql
BASH


같이 보기

Ref