기본적으로 실행할 때
docker run -it [myimage]
또는
docker attach [mycontainer]
루트 사용자로 터미널에 연결했지만 다른 사용자로 연결하고 싶습니다. 이것이 가능한가?
답변
대상 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
- `su를 사용하여 사용자 변경
답변
다음과 같은 명령을 사용하여 실행중인 Docker 컨테이너에서 셸을 실행할 수 있습니다.
docker exec -it --user root <container id> /bin/bash
답변
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
기계는 빌드에 의해 만들어진 모든 파일 / 디렉토리의 사용자 소유권을 할 수 있습니다.
이것이 우리를 위해 작동하는 동안. 일종의 해키처럼 보입니다. 나는 대체 구현에 열려 있습니다 …
답변
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
