Docker 컨테이너에서 생성된 파일은 루트가 소유합니다.

Docker 컨테이너에서 생성된 파일은 루트가 소유합니다.

오류가 발생할 때 로그와 유사한 파일을 생성하는 Docker 이미지가 있습니다. 바인드 마운트를 사용하여 호스트에 쓰는 디렉토리를 마운트했습니다. 그런데 생성 된 파일은 root.chownchgrp

컨테이너가 파일의 소유자 및 그룹을 컨테이너를 실행하는 사용자의 소유자 및 그룹으로 설정하도록 하는 방법이 있습니까?

어떤 맥락에서 제가 만든 장난감 예제는 다음과 같습니다.

도커파일

FROM debian

WORKDIR /root
VOLUME /root/output

COPY run.sh /root/

ENTRYPOINT ["./run.sh"]

실행 sh

#!/bin/bash

echo hello > output/dump

내 실행 명령은

docker run -v $PWD/output:/root/output test

답변1

이러한 파일은 컨테이너 내부에서 실행되는 사용자에 의해 생성됩니다. 컨테이너화 명령이 실행되면 root모든 파일이 루트로 생성됩니다.

다른 사용자로 파일을 생성하려면 해당 다른 사용자로 컨테이너를 실행하세요. 예를 들어

docker run -v "$(pwd)/output":/root/output -u $(whoami) test

참고: 컨테이너에 따라 이 기능이 기본적으로 작동하지 않을 수 있습니다(예: 컨테이너 내부에서 권한 있는 포트를 열어야 하거나 스크립트가 특정 (수퍼)유저만 액세스할 수 있기 때문입니다).

답변2

이것은오래된 알려진 오류. 해결 방법으로 사용할 수 있습니다보드맨, Docker와 호환되며 추가를 제안하기도 했습니다 alias docker=podman. 여기서 질문의 한 가지 장점은 Podman에 루트로 실행되는 서비스가 필요하지 않다는 것입니다. 보안에 좋을 뿐만 아니라, 실제로 이런 실수를 예방해줍니다.

데모:

$ ls -l /tmp/hello
ls: cannot access 'hello': No such file or directory
$ podman run --rm -v /tmp/:/mnt/ -it ubuntu:22.04 sh -c "touch /mnt/hello && ls -l /mnt/hello"
-rw-r--r--. 1 root root 0 Sep 26 03:57 /mnt/hello
$ ls -l /tmp/hello
-rw-r--r--. 1 konstantin konstantin 0 сен 26 06:57 hello

관련 정보