기본적으로 실행할 때
docker run -it [myimage]
또는
docker attach [mycontainer]
루트 사용자로 터미널에 연결했지만 다른 사용자로 연결하고 싶습니다. 이것이 가능한가?
기본적으로 실행할 때
docker run -it [myimage]
또는
docker attach [mycontainer]
루트 사용자로 터미널에 연결했지만 다른 사용자로 연결하고 싶습니다. 이것이 가능한가?
su user_name
답변:
대상 docker run
:
--user <user>
Docker 컨테이너를 시작할 때 다른 사용자로 변경 하는 옵션 을 추가하기 만하면 됩니다.
docker run -it --user nobody busybox
들어 docker attach
나 docker 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)
정말로 갖고 싶은 사용자에게 연결하고 싶다면
run --user <user>
하거나 Dockerfile
사용시 언급USER
다음과 같은 명령을 사용하여 실행중인 Docker 컨테이너에서 셸을 실행할 수 있습니다.
docker exec -it --user root <container id> /bin/bash
--user
내가 생각하는 루트로 명령을 실행해야 할 때 옵션을 생략 할 수 있습니다.
USER
USER
Dockerfile에서 지정할 수 있습니다 . 모든 후속 작업은 해당 계정을 사용하여 수행됩니다. 이미지를 빌드 할 때가 아니라 컨테이너를 시작할 때만 해당 사용자를 사용하려는 경우 또는 USER
앞에 한 줄을 지정할 수 있습니다 . 결과 이미지에서 컨테이너를 시작하면 지정된 사용자로 연결됩니다.CMD
ENTRYPOINT
내가 작동하도록 할 수있는 유일한 방법은 다음과 같습니다.
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
기계는 빌드에 의해 만들어진 모든 파일 / 디렉토리의 사용자 소유권을 할 수 있습니다.
이것이 우리를 위해 작동하는 동안. 일종의 해키처럼 보입니다. 나는 대체 구현에 열려 있습니다 ...
2020 년 업데이트 된 답변입니다. --user, -u 옵션은 사용자 이름 또는 UID입니다 (형식 : <name | uid> [: <group | gid>]).
그런 다음 이렇게 작동합니다.
docker exec -it -u root:root container /bin/bash
참조 : https://docs.docker.com/engine/reference/commandline/exec/
이것은 "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 의 답변을 기반으로합니다 . 감사합니다!
docker run --user user_name