호스트 운영 체제: Debian 11 Bullseye
도커 버전: 5:24.0.2-1~debian.11~bullseye
컨테이너 운영 체제: Debian 10 Buster
문맥
애플리케이션을 컨테이너화하려고 하는데 컨테이너를 다시 시작해도 상태를 유지해야 합니다.
모든 동적 데이터를 /var/lib/
.
따라서 가장 간단한 해결책은 디렉터리를 도커 볼륨으로 덮어쓰는 것입니다.
표준 Docker 작업에서는 이는 문제가 되지 않습니다. 그러나 잠재적인 컨테이너 누출 및 컨테이너 이스케이프 취약성에 대한 보안 문제로 인해 Docker 데몬과 컨테이너 애플리케이션 모두 루트가 아닌 사용자로 실행되는 것이 좋습니다.
질문
컨테이너 내부의 애플리케이션도 권한이 없는 사용자로 실행되어야 하기 때문에 애플리케이션 사용자가 쓸 수 있는 방식으로 볼륨을 마운트할 수 없습니다.
폴더 소유자를 설정하는 동안빌드 단계이미지가 실행되는 동안에만 설치로 덮어쓰므로 의미가 없습니다.
그리고 나중에 권한을 변경할 수 없습니다.컨테이너 시작권한이 없는 사용자의 컨텍스트에서 이미 실행 중이고 마운트 지점이 root:root 소유이기 때문입니다.
질문
제 질문은 간단합니다. 권한이 없는 사용자를 위해 컨테이너 내에서 RW 볼륨 마운트를 구현하는 방법이 있습니까?
답변1
이것을 달성할 방법을 찾고 있는 사람을 위해 결국 거기에 도달했지만 방법이 명확하지 않습니다.
주요 사항은 다음과 같습니다.
- 이미지를 루트로 실행
- 다음을 수행할 수 있는 스크립트에 대한 진입점을 설정합니다.
- 먼저 볼륨 마운트 지점을 재귀적으로 조정합니다.
- 기본 예상 프로세스에 실행을 전달하고 프로세스에서 사용자를 변경합니다.
gosu
두 번째 포인트 는 인벤토리를 사용하면 필요한 만큼 작업을 할 수 없기 때문에 관리를 사용했습니다 .su
진입점 스크립트의 전체 예:
#!/bin/sh
chown -R myAppUser: /var/lib/myAppData
exec gosu myAppUser /usr/local/bin/myApp --foo=bar
최종 결과: 루트가 없는 Docker 인스턴스에서도 외부에 마운트된 볼륨에 대한 전체 읽기 및 쓰기 액세스 권한을 갖고 myApp
Docker에서 실행됩니다 .myAppUser
/var/lib/myAppData