| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 문제해결
- 백업
- postgresql
- Telegram
- 권한
- 마이그레이션
- 컨테이너
- GNU-Screen
- 홈서버
- virtiofs
- Bedrock Dedicated Server
- minecraft
- tmux
- 자동화
- 모니터링
- Apple Silicon
- Apple Container
- MacOS
- Docker
- ssh
- Today
- Total
삽질일기
Apple Container로 PostgreSQL 실행하기: 권한 문제와 해결책 본문
Apple Container는?
Apple이 WWDC 2025에서 발표한 Containerization 프레임워크와 container는 macOS에서 네이티브로 Linux 컨테이너를 실행할 수 있는 새로운 도구입니다. Swift로 작성되었고 Apple Silicon에 최적화된 이 도구는 기존 Docker Desktop와는 근본적으로 다른 접근 방식을 취합니다. (https://github.com/apple/container)
Docker Desktop이 하나의 큰 Linux VM 안에서 모든 컨테이너를 공유 방식으로 실행하는 반면, Apple container는 각 컨테이너마다 독립적인 경량 VM을 할당합니다. 이러한 설계는 더 강력한 보안 격리를 제공하면서도 서브초 시작 시간과 향상된 성능을 달성했다고 Apple은 주장합니다. 또한 Apple의 네이티브 Virtualization.framework와 직접 통합되어 Docker Desktop의 VM 오버헤드 없이 진정한 네이티브 성능을 제공합니다.
하지만 이런 아키텍처 차이는 기존 Docker 환경에서 작동하던 설정이 Apple container에서는 다르게 동작할 수 있음을 의미합니다. 실제로 PostgreSQL을 마이그레이션하는 과정에서 흥미로운 권한 문제를 경험했고, 이를 해결한 과정을 공유하고자 합니다.
문제 상황
기존 Docker 환경에서 사용하던 PostgreSQL 설정을 Apple Container로 옮기려고 했습니다.
# 기존 Docker 명령어
docker run --rm -d --name postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 \
-v /Users/username/data:/var/lib/postgresql/data \
postgres
# Apple Container CLI로 변경
container run -d --rm --name postgres \
-e POSTGRES_PASSWORD=postgres \
-p 5432:5432 \
-v /Users/username/data:/var/lib/postgresql/data \
postgres
하지만 컨테이너가 즉시 종료되며 다음과 같은 에러가 발생했습니다.
chmod: changing permissions of '/var/lib/postgresql/data': Operation not permitted
chown: changing ownership of '/var/lib/postgresql/data': Operation not permitted
문제 분석
Docker Desktop과 Apple Container의 아키텍처 차이
Docker Desktop
- 하나의 큰 Linux VM 내에서 모든 컨테이너 실행
- 호스트 파일시스템을 VM 전체와 공유
- VM 내부에서 bind mount 처리
Apple Container
- 각 컨테이너마다 독립적인 경량 VM
- virtiofs를 통해 개별 디렉토리를 직접 마운트
권한 문제의 근본 원인
- PostgreSQL의 보안 요구사항: PostgreSQL은 시작할 때 데이터 디렉토리의 소유권을 postgres 사용자로 변경하고 권한을 700으로 설정해야 합니다.
- virtiofs의 제한사항: Apple Container가 사용하는 virtiofs 파일시스템 공유 방식에서는 마운트 포인트 자체에 대한 메타데이터 변경이 제한되어, PostgreSQL이 요구하는 권한 설정이 실패합니다.
- Docker Desktop에서는 작동했던 이유: 호스트 파일시스템을 LinuxKit VM 전체와 공유한 후, VM 내부에서 bind mount를 수행하기 때문에 실제 권한 변경이 VM의 파일시스템에서 이루어져 문제없이 동작합니다.
해결 과정
시도한 방법들
1. --user 옵션 사용: 현재 사용자 ID로 실행 시도
container run --user $(id -u):$(id -g) ...
결과: exit code -1로 실패
2. PGDATA 경로 변경: PostgreSQL 데이터 디렉토리 경로 변경
-e PGDATA=/var/lib/postgresql/data/pgdata
결과: 기존 데이터와 호환되지 않음
최종 해결책
Apple의 공식 GitHub 이슈 #333에서 해결책을 발견했습니다. 핵심은 마운트 포인트를 데이터 디렉토리의 상위 디렉토리로 설정하는 것입니다.
문제 상황
마운트: /host/data → /var/lib/postgresql/data
PostgreSQL 시도: chmod /var/lib/postgresql/data (마운트 포인트 자체)
결과: virtiofs가 마운트 포인트 메타데이터 변경 거부
해결 후
마운트: /host/parent → /var/lib/postgresql
PostgreSQL 시도: chmod /var/lib/postgresql/data (마운트 포인트 내부 디렉토리)
결과: virtiofs가 내부 디렉토리 권한 변경 허용
구체적인 적용 방법
기존 디렉토리 구조
/Users/username/
├── data/ # PostgreSQL 데이터 파일들
└── shared/ # 공유 폴더
해결된 명령어
container run -d --rm --name postgres \
-e POSTGRES_PASSWORD=postgres \
-e PGDATA=/var/lib/postgresql/data \
-p 5432:5432 \
-v /Users/username:/var/lib/postgresql \
postgres
- /var/lib/postgresql/data → 기존 PostgreSQL 데이터
- /var/lib/postgresql/shared → 공유 폴더 접근 가능
- 마운트 포인트는 /var/lib/postgresql 이므로 권한 문제 회피
마무리
Apple container가 사용하는 virtiofs는 마운트 포인트 자체에 대한 메타데이터 변경을 제한합니다. PostgreSQL처럼 시작 시 데이터 디렉토리 권한을 설정하는 애플리케이션에서는 마운트 포인트를 한 단계 위로 설정하는 것이 해결책입니다.
동일한 컨테이너 이미지라도 런타임에 따라 볼륨 마운트 동작이 다를 수 있습니다. Docker Desktop의 VM 내부 bind mount 방식과 Apple container의 직접 마운트 방식은 서로 다른 제약사항을 가집니다.
GitHub 이슈 트래커에서 동일한 문제를 겪은 사용자들과 해결책을 찾을 수 있었습니다.