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?
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?
su user_name
Odpowiedzi:
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 attach
lubdocker 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
run --user <user>
lub wspomnij o nim w swoimDockerfile
użyciuUSER
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
--user
Opcję można pominąć, gdy polecenia muszą być uruchamiane jako root.
USER
instrukcji, patrz docs.docker.com/engine/reference/builder/#user
Możesz określić USER
w pliku Dockerfile. Wszystkie kolejne akcje będą wykonywane przy użyciu tego konta. Możesz określić USER
jedną linię przed CMD
lub, ENTRYPOINT
jeś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.
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.
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-image
zawiera 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.sh
jest skrypt pokazany powyżej. Plikaddgroup/useradd
Maszyny 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 ...
Wykonaj polecenie jako użytkownik danych www: docker exec -t --user www-data container bash -c "ls -la"
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/
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.
docker run --user user_name