진행하고 있는 프로젝트가 WSL을 사용하여 개발 프로젝트를 진행 중인데 WSL에서 postgres의 docker 실행하면 permisison 관련하여 아래와 같은 오류가 발생한다.
chmod: changing permissions of '/var/lib/postgresql/data': Operation not permitted
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.
The database cluster will be initialized with locale "en_US.utf8".
The default database encoding has accordingly been set to "UTF8".
The default text search configuration will be set to "english".
Data page checksums are disabled.
initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted
volume으로 지정한 디렉토리의 permission 이슈로 해당 오류와 관련된 글들을 찾아보면 원인은 아래 2가지로 주로 나온다
(원인 1) 디렉토리에 RWX 권한이 없음
(원인 2) user가 docker의 유저와 매핑 되지 않아 발생
ls로 디렉토리의 권한 확인 시 1의 경우는 문제 없음을 확인하였다.
따라서 2번이 문제로 판단되어 해당 이슈를 해결 해 보려 했다.
2번을 해결하기 위해 주로 추천하는 방식은
docker 그룹에 사용자 계정을 추가하고 docker에 매핑하는 것이다.
1) docker group에 계정 추가
$ cat /etc/group위 명령어는 사용자 계정 그룹 확인 명령어이다.
내 경우에는 확인 시 docker 그룹에 사용 계정이 추가되어 있었다.만일 추가되지 않았다면 아래 명령어를 사용하면 추가된다.
$ sudo usermod -aG docker $USER2) docker 계정 매핑
아래는 docker compose 설정 파일에서 UID, GID를 매핑services: postgres: user: "${UID_GID}"docker compose를 실행 시 uid와 gid를 환경 변수로 설정하면 매핑이 된다.
UID_GID = $(id -u):$(id -g) docker-compose up
그러나 이 방식을 사용해도 나의 경우 에러 종류가 바뀌었을 뿐 실제 permission 에러는 해결되지 않았다.
그래서 원인에 대해 다시 찾아보게 되었다.
그러다 발견한 것이 (원인3) WSL에서는 windows가 소유한 파일에 대한 권한에 문제가 있다는 것이다.
이 문제를 해결하려면 윈도우가 관리하는 폴더가 아니라 wsl의 ubuntu에서 관리하는 디렉토리를 docker의 volumn으로 설정해야 한다는 것이다.
자세한 사항은 다음 링크를 참고
https://forums.docker.com/t/postgres-in-wsl-2-with-docker-operation-not-permitted-when-i-share-volumes-enter-windows-folder/92161/3
그래서 다음과 같이 수정하였고 wsl에서의 postgres docker의 permission 문제가 해결되는 것을 확인 하였다.
원래의 볼륨 설정
services:
postgres:
volumes:
- ./data/pgdata:/var/lib/postgresql/data
./data/pgdata는 현재 docker compose가 있는 작업 소스의 하위 디렉토리이다.
현재 작업 소스는 wsl에서 경로 확인 시 "/mnt/d/"에 있다.
즉 윈도우에서 관리되는 폴더다
볼륨 설정 수정
이 경로를 윈도우 관리 폴더 대신에 wsl 내의 리눅스 시스템에서 사용하는 폴더로 변경
services:
postgres:
volumes:
- ~/data/pgdata:/var/lib/postgresql/data
위와 같이 직접적으로 volume 위치를 지정해도 되고 docker의 default volume을 사용하도록 설정하는 방법도 있다
docker의 default volume을 사용하도록 설정하는 방식은 위의 참고 링크를 확인하면 된다