Conéctese al contenedor de Docker como un usuario que no sea root

84

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?

Andy59469
fuente
3
Si. docker run --user user_name
Xiongbing Jin
1
No existe tal opción para adjuntar. Tendrás que iniciar sesión como root y luegosu user_name
Xiongbing Jin

Respuestas:

93

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 attacho 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

  1. comience con ese usuario run --user <user>o menciónelo en su DockerfileusoUSER
  2. cambiar el usuario usando `su
Larry Cai
fuente
72

Puede ejecutar un shell en un contenedor docker en ejecución utilizando un comando como:

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

Jason
fuente
2
root es el usuario predeterminado. --userLa opción se puede omitir cuando los comandos deben ejecutarse como root, supongo.
Stphane
8
@Stphane, ese no es siempre el caso, ya que el usuario predeterminado se puede personalizar en Dockerfile a través de la USERinstrucción, consulte docs.docker.com/engine/reference/builder/#user
ryenus
5

Puede especificar USERen el Dockerfile. Todas las acciones posteriores se realizarán utilizando esa cuenta. Puede especificar USERuna línea antes de CMDo ENTRYPOINTsi 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.

kliew
fuente
Además, nunca olvides configurar HOME
karthik101
2

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.

eigenfield
fuente
No funcionó "como está", pero me dirigió a una solución de trabajo. ¡Gracias!
Josef Sábl
1

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 /cmddentro 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-imagecontiene 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.shestá el script que se muestra arriba? La addgroup/useraddmaquinaria 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 ...

rmccabe3701
fuente
0

Ejecute el comando como usuario de www-data: docker exec -t --user www-data container bash -c "ls -la"

Vasili Pascal
fuente
0

Para docker-compose. En el docker-compose.yml:

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

En .env:

UID=1000
x-yuri
fuente
0

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.

Josef Sábl
fuente