programing

루트가 아닌 다른 사용자로 도커 컨테이너에 연결

closeapi 2023. 8. 29. 20:38
반응형

루트가 아닌 다른 사용자로 도커 컨테이너에 연결

실행할 때 기본적으로

docker run -it [myimage]

OR

docker attach [mycontainer]

당신은 root 사용자로 터미널에 연결하지만 저는 다른 사용자로 연결하고 싶습니다.이것이 가능합니까?

위해서docker run:

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

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)

원하는 사용자에게 정말로 첨부하고 싶다면,

  1. 해당 사용자로 시작run --user <user>아니면 당신의 것에 그것을 언급하세요.Dockerfile사용.USER
  2. 'su'를 사용하여 사용자 변경

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

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

2020년부터 업데이트된 답변입니다.--user,-u옵션은Username or UID (format: <name|uid>[:<group|gid>]).

그러면 저한테는 이렇게 먹히겠죠.

docker exec -it -u root:root container /bin/bash

참조: https://docs.docker.com/engine/reference/commandline/exec/

지정할 수 있습니다.USER도커 파일에 있습니다.이후의 모든 작업은 해당 계정을 사용하여 수행됩니다.지정할 수 있습니다.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용기 안에.

나는 이 워크플로우를 사용하여 개발 팀이 bsp를 유지하는 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/useraddmachine을 사용하면 빌드에 의해 생성된 모든 파일/디렉토리를 사용자가 검색할 수 있습니다.

이 일이 우리에게 효과가 있는 동안.좀 촌스러워 보여요.저는 다른 구현 방법을 선택할 수 있습니다.

위해서docker-compose.에서docker-compose.yml:

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

.env:

UID=1000

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

이를 통해 "WSL2로 Docker Desktop을 실행하는 Windows의 nodejs 컨테이너에 웹 팩 내용을 컴파일하고 현재 로그인한 사용자 아래에 빌드된 자산을 보유하십시오."라는 제 사용 사례를 해결했습니다.

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

고유 필드별 답변을 기준으로 합니다.감사해요!

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

언급URL : https://stackoverflow.com/questions/35734474/connect-to-docker-container-as-user-other-than-root

반응형