Połącz się z kontenerem Dockera jako użytkownik inny niż root

85

Domyślnie podczas uruchamiania

docker run -it [myimage]

LUB

docker attach [mycontainer]

łączysz się z terminalem jako użytkownik root, ale chciałbym połączyć się jako inny użytkownik. czy to możliwe?

Andy59469
źródło
3
Tak. docker run --user user_name
Xiongbing Jin
1
Nie ma takiej możliwości dołączenia. Będziesz musiał zalogować się jako root, a następniesu user_name
Xiongbing Jin

Odpowiedzi:

94

Dla docker run :

Po prostu dodaj opcję --user <user>zmiany na innego użytkownika po uruchomieniu kontenera Dockera.

docker run -it --user nobody busybox

Dla docker attachlubdocker exec :

Ponieważ polecenie służy do dołączania / wykonywania do istniejącego procesu, dlatego bezpośrednio używa tam bieżącego użytkownika.

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)

Jeśli naprawdę chcesz dołączyć do użytkownika, którego chcesz mieć, to

  1. zacznij od tego użytkownika run --user <user>lub wspomnij o nim w swoimDockerfile użyciuUSER
  2. zmień użytkownika używając `su
Larry Cai
źródło
72

Możesz uruchomić powłokę w działającym kontenerze docker za pomocą polecenia takiego jak:

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

Jason
źródło
2
root jest użytkownikiem domyślnym. --userOpcję można pominąć, gdy polecenia muszą być uruchamiane jako root.
Stphane
8
@Stphane nie zawsze tak jest, ponieważ domyślnego użytkownika można dostosować w Dockerfile za pomocą USERinstrukcji, patrz docs.docker.com/engine/reference/builder/#user
ryenus
5

Możesz określić USERw pliku Dockerfile. Wszystkie kolejne akcje będą wykonywane przy użyciu tego konta. Możesz określić USERjedną linię przed CMDlub, ENTRYPOINTjeśli chcesz użyć tego użytkownika tylko podczas uruchamiania kontenera (a nie podczas tworzenia obrazu). Po uruchomieniu kontenera z obrazu wynikowego dołączysz jako określony użytkownik.

kliew
źródło
Nigdy też nie zapomnij ustawić HOME
karthik101
2

Jedyny sposób, w jaki mogę to zrobić, to:

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

Więc muszę zarówno określić zmienną środowiskową $ USER, jak i wskazać plik / etc / passwd. W ten sposób mogę skompilować w folderze / siem i zachować prawo własności do plików, które nie są tam jako root.

własne
źródło
Nie działa „tak jak jest”, ale skierował mnie do rozwiązania roboczego. Dziękuję Ci!
Josef Sábl
1

Moje rozwiązanie:

#!/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})"

Umożliwia to użytkownikowi uruchamianie dowolnych poleceń za pomocą narzędzi udostępnianych przez my-docker-image. Zwróć uwagę, w jaki sposób podłączany jest bieżący katalog roboczy użytkownika /cmd wewnątrz kontenera.

Używam tego przepływu pracy, aby umożliwić mojemu zespołowi programistów kompilację krzyżową kodu C / C ++ dla celu arm64, którego bsp obsługuję ( my-docker-imagezawiera kompilator krzyżowy, sysroot, make, cmake itp.). Dzięki temu użytkownik może po prostu zrobić coś takiego:

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

Gdzie cross_compile.shjest skrypt pokazany powyżej. Plikaddgroup/useraddMaszyny pozwala obsługi własność żadnych plików / katalogów tworzonych przez kompilacji.

Chociaż to działa dla nas. Wydaje się trochę hacky. Jestem otwarty na alternatywne wdrożenia ...

rmccabe3701
źródło
0

Wykonaj polecenie jako użytkownik danych www: docker exec -t --user www-data container bash -c "ls -la"

Wasilij Pascal
źródło
0

Dla docker-compose. W docker-compose.yml:

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

W .env:

UID=1000
x-yuri
źródło
0

Jako zaktualizowana odpowiedź z 2020 r. --User, opcja -u to Nazwa użytkownika lub UID (format: <nazwa | uid> [: <grupa | gid>]).

Wtedy działa na mnie w ten sposób,

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

Źródła: https://docs.docker.com/engine/reference/commandline/exec/

Nurhun
źródło
0

To rozwiązało mój przypadek użycia, który jest następujący: „Skompiluj zawartość pakietu webpack w kontenerze nodejs w systemie Windows z systemem Docker Desktop z WSL2 i miej wbudowane zasoby pod aktualnie zalogowanym użytkownikiem”.

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

Na podstawie odpowiedzi eigenfielda . Dziękuję Ci!

Również ten materiał pomógł mi zrozumieć, co się dzieje.

Josef Sábl
źródło