[docker] 루트가 아닌 사용자로 Docker 컨테이너에 연결

기본적으로 실행할 때

docker run -it [myimage]

또는

docker attach [mycontainer]

루트 사용자로 터미널에 연결했지만 다른 사용자로 연결하고 싶습니다. 이것이 가능한가?



답변

대상 docker run:

--user <user>Docker 컨테이너를 시작할 때 다른 사용자로 변경 하는 옵션 을 추가하기 만하면 됩니다.

docker run -it --user nobody busybox

들어 docker attachdocker exec:

명령은 기존 프로세스에 연결 / 실행하는 데 사용되므로 현재 사용자를 직접 사용합니다.

docker run -it busybox  # CTRL-P/Q to quit
docker attach <container id>  # then you have root user
/ # id
uid=0(root) gid=0(root) groups=10(wheel)

docker run -it --user nobody busybox # CTRL-P/Q to quit
docker attach <container id>
/ $ id
uid=99(nobody) gid=99(nogroup)

정말로 갖고 싶은 사용자에게 연결하고 싶다면

  1. 해당 사용자로 시작 run --user <user>하거나 Dockerfile사용시 언급USER
  2. `su를 사용하여 사용자 변경


답변

다음과 같은 명령을 사용하여 실행중인 Docker 컨테이너에서 셸을 실행할 수 있습니다.

docker exec -it --user root <container id> /bin/bash


답변

USERDockerfile에서 지정할 수 있습니다 . 모든 후속 작업은 해당 계정을 사용하여 수행됩니다. 이미지를 빌드 할 때가 아니라 컨테이너를 시작할 때만 해당 사용자를 사용하려는 경우 또는 USER앞에 한 줄을 지정할 수 있습니다 . 결과 이미지에서 컨테이너를 시작하면 지정된 사용자로 연결됩니다.CMDENTRYPOINT


답변

내가 작동하도록 할 수있는 유일한 방법은 다음과 같습니다.

docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus

따라서 $ USER 환경 변수를 지정하고 / etc / passwd 파일을 지정해야합니다. 이런 식으로 / siem 폴더에서 컴파일하고 루트가 아닌 파일의 소유권을 유지할 수 있습니다.


답변

내 솔루션 :

#!/bin/bash
user_cmds="$@"

GID=$(id -g $USER)
UID=$(id -u $USER)
RUN_SCRIPT=$(mktemp -p $(pwd))
(
cat << EOF
addgroup --gid $GID $USER
useradd --no-create-home --home /cmd --gid $GID --uid $UID  $USER
cd /cmd
runuser -l $USER -c "${user_cmds}"
EOF
) > $RUN_SCRIPT

trap "rm -rf $RUN_SCRIPT" EXIT

docker run -v $(pwd):/cmd --rm my-docker-image "bash /cmd/$(basename ${RUN_SCRIPT})"

이를 통해 사용자는에서 제공하는 도구를 사용하여 임의의 명령을 실행할 수 있습니다 my-docker-image. 사용자의 현재 작업 디렉토리가 /cmd컨테이너 내부에 볼륨 마운트되는 방식에 유의하십시오 .

이 워크 플로를 사용하여 개발 팀이 내가 유지 관리하는 arm64 대상에 대한 C / C ++ 코드를 크로스 컴파일 할 수 my-docker-image있습니다 (크로스 컴파일러, sysroot, make, cmake 등 이 포함됨 ). 이를 통해 사용자는 다음과 같이 간단히 수행 할 수 있습니다.

cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"

cross_compile.sh위에 표시된 스크립트는 어디에 있습니까 ? addgroup/useradd기계는 빌드에 의해 만들어진 모든 파일 / 디렉토리의 사용자 소유권을 할 수 있습니다.

이것이 우리를 위해 작동하는 동안. 일종의 해키처럼 보입니다. 나는 대체 구현에 열려 있습니다 …


답변

www-data 사용자로 명령 실행 : docker exec -t --user www-data container bash -c "ls -la"


답변

들어 docker-compose. 에서 docker-compose.yml:

version: '3'
services:
    app:
        image: ...
        user: ${UID:-0}
...

에서 .env:

UID=1000