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


84

기본적으로 실행할 때

docker run -it [myimage]

또는

docker attach [mycontainer]

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


3
예. docker run --user user_name
Xiongbing Jin

1
이러한 첨부 옵션은 없습니다. 그런 다음 루트로 로그인해야합니다su user_name
Xiongbing 진에게

답변:


93

대상 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를 사용하여 사용자 변경

72

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

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


2
root 는 기본 사용자입니다. --user내가 생각하는 루트로 명령을 실행해야 할 때 옵션을 생략 할 수 있습니다.
Stphane

8
@Stphane은 기본 사용자가 지침을 통해 Dockerfile 에서 사용자 정의 될 수 있기 때문에 항상 그런 것은 아닙니다. docs.docker.com/engine/reference/builder/#userUSER
ryenus

5

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


또한 세트 홈페이지에 잊지 못할
karthik101

2

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

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

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


'있는 그대로'작동하지 않았지만 작업 솔루션으로 안내했습니다. 감사합니다!
Josef Sábl

1

내 솔루션 :

#!/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기계는 빌드에 의해 만들어진 모든 파일 / 디렉토리의 사용자 소유권을 할 수 있습니다.

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



0

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

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

에서 .env:

UID=1000


0

이것은 "WSL2로 Docker Desktop을 실행하는 Windows의 nodejs 컨테이너에서 webpack 항목을 컴파일하고 현재 로그인 한 사용자 아래에 빌드 된 자산을 갖습니다."라는 사용 사례를 해결했습니다.

docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'

eigenfield 의 답변을 기반으로합니다 . 감사합니다!

또한 자료는 무슨 일이 일어나고 있는지 이해하는 데 도움 되었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.