POR defecto cuando corres
docker run -it [myimage]
O
docker attach [mycontainer]
te conectas a la terminal como usuario root, pero me gustaría conectarme como un usuario diferente. es posible?
POR defecto cuando corres
docker run -it [myimage]
O
docker attach [mycontainer]
te conectas a la terminal como usuario root, pero me gustaría conectarme como un usuario diferente. es posible?
su user_name
Respuestas:
Para docker run
:
Simplemente agregue la opción --user <user>
para cambiar a otro usuario cuando inicie el contenedor de la ventana acoplable.
docker run -it --user nobody busybox
Para docker attach
o docker exec
:
Dado que el comando se usa para adjuntar / ejecutar en el proceso existente, usa al usuario actual allí directamente.
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)
Si realmente desea adjuntar al usuario que desea tener, entonces
run --user <user>
o menciónelo en su Dockerfile
usoUSER
Puede ejecutar un shell en un contenedor docker en ejecución utilizando un comando como:
docker exec -it --user root <container id> /bin/bash
--user
La opción se puede omitir cuando los comandos deben ejecutarse como root, supongo.
USER
instrucción, consulte docs.docker.com/engine/reference/builder/#user
Puede especificar USER
en el Dockerfile. Todas las acciones posteriores se realizarán utilizando esa cuenta. Puede especificar USER
una línea antes de CMD
o ENTRYPOINT
si solo desea usar ese usuario al iniciar un contenedor (y no al crear la imagen). Cuando inicie un contenedor desde la imagen resultante, lo adjuntará como el usuario especificado.
La única forma en que puedo hacer que funcione es mediante:
docker run -it -e USER=$USER -v /etc/passwd:/etc/passwd -v `pwd`:/siem mono bash
su - magnus
Así que tengo que especificar la variable de entorno $ USER y señalar el archivo / etc / passwd. De esta manera, puedo compilar en la carpeta / siem y conservar la propiedad de los archivos que no están como root.
Mi solución:
#!/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})"
Esto permite al usuario ejecutar comandos arbitrarios utilizando las herramientas proporcionadas por my-docker-image
. Observe cómo el directorio de trabajo actual del usuario está montado en volumen /cmd
dentro del contenedor.
Estoy usando este flujo de trabajo para permitir que mi equipo de desarrollo realice una compilación cruzada de código C / C ++ para el objetivo arm64, cuyo bsp mantengo ( my-docker-image
contiene el compilador cruzado, sysroot, make, cmake, etc.). Con esto, un usuario puede simplemente hacer algo como:
cd /path/to/target_software
cross_compile.sh "mkdir build; cd build; cmake ../; make"
¿Dónde cross_compile.sh
está el script que se muestra arriba? La addgroup/useradd
maquinaria permite al usuario la propiedad de cualquier archivo / directorio creado por la compilación.
Si bien esto funciona para nosotros. Parece una especie de hacky. Estoy abierto a implementaciones alternativas ...
Ejecute el comando como usuario de www-data: docker exec -t --user www-data container bash -c "ls -la"
Como respuesta actualizada de 2020. --user, la opción -u es Nombre de usuario o UID (formato: <nombre | uid> [: <grupo | gid>]).
Entonces, me funciona así,
docker exec -it -u root:root container /bin/bash
Referencia: https://docs.docker.com/engine/reference/commandline/exec/
Esto resolvió mi caso de uso que es: "Compile el material del paquete web en el contenedor nodejs en Windows que ejecute Docker Desktop con WSL2 y tenga los activos construidos bajo su usuario actualmente conectado".
docker run -u 1000 -v "$PWD":/build -w /build node:10.23 /bin/sh -c 'npm install && npm run build'
Basado en la respuesta de eigenfield . ¡Gracias!
Además, este material me ayudó a comprender lo que está pasando.
docker run --user user_name