Normalmente, los contenedores Docker se ejecutan utilizando la raíz del usuario . Me gustaría usar un usuario diferente, lo cual no es un problema usando la directiva USER de docker. Pero este usuario debería poder usar sudo dentro del contenedor. Este comando falta.
Aquí hay un Dockerfile simple para este propósito:
FROM ubuntu:12.04
RUN useradd docker && echo "docker:docker" | chpasswd
RUN mkdir -p /home/docker && chown -R docker:docker /home/docker
USER docker
CMD /bin/bash
Al ejecutar este contenedor, me conecto con el usuario 'docker'. Cuando intento usar sudo, no se encuentra el comando. Así que intenté instalar el paquete sudo dentro de mi Dockerfile usando
RUN apt-get install sudo
Esto resulta en No se puede localizar el paquete sudo
docker
sudo
linux-containers
drubb
fuente
fuente
Respuestas:
Acabo de recibirlo. Como señaló Regan, tuve que agregar al usuario al grupo de sudoers. Pero la razón principal fue que olvidé actualizar el caché de repositorios, por lo que apt-get no pudo encontrar el paquete sudo. Está funcionando ahora. Aquí está el código completo:
fuente
adduser
comando escupe la ayuda de uso parauseradd
/etc/sudoers.d/
y establecer los permisos440
en ese archivo. Entonces el usuario tendría acceso a sudo en CentOS, 6 y superior. 5 tendrá que agregar la#includedir /etc/sudoers.d
directiva en/etc/sudoers
Cuando ni sudo ni apt-get están disponibles en el contenedor, también puede saltar al contenedor en ejecución como usuario root utilizando el comando
fuente
Las otras respuestas no me funcionaron. Seguí buscando y encontré una publicación de blog que cubría cómo un equipo estaba ejecutando no root dentro de un contenedor acoplable.
Aquí está la versión TL; DR:
Estaba usando
FROM node:9.3
esto, pero sospecho que otras bases de contenedores similares también funcionarían.fuente
ubuntu:bionic-20180724.1
. Usé este enfoque pero, después de lo anterior, no me permite instalar otro paquete. Me adjuntas una línea a lo anteriorDockerfile
con el fin de instalar un paquete con:RUN apt-get install -y tree
. Sin embargo, me dio este mensaje de error:Step xxxx/xxxx : RUN apt-get install -y tree ---> Running in j5e6gsvwfafa Reading package lists... E: Could not open lock file /var/lib/apt/lists/lock - open (13: Permission denied) E: Unable to lock directory /var/lib/apt/lists/
RUN sudo apt-get install -y tree
. Después de configurarloUSER
en algo diferenteroot
, deberá usarsudo
cualquier comando que requieraroot
privilegios.sudo
fuera permitido en un Dockerfile.Para cualquiera que tenga este problema con un contenedor que ya se está ejecutando, y no necesariamente quiere reconstruir, el siguiente comando se conecta a un contenedor en ejecución con privilegios de root:
También puede conectarse usando su ID, en lugar de su nombre, al encontrarlo con:
Para guardar sus cambios para que sigan allí la próxima vez que inicie el contenedor (o el clúster docker-compose):
Para iniciar un contenedor que no se está ejecutando y conectarse como root:
Para copiar desde un contenedor en ejecución:
Para exportar una copia de la imagen:
Que puede restaurar a otra instalación de Docker usando:
Es mucho más rápido pero toma más espacio para no comprimir, usando:
Y:
fuente
si quieres conectarte al contenedor e instalar algo
usando apt-get
primero como la respuesta anterior de nuestro hermano "Tomáš Záluský"
entonces trata de
funcionó conmigo espero que sea útil para todos
fuente
Si no se puede acceder a SUDO o apt-get dentro del Contenedor, puede usar la siguiente opción en el contenedor en ejecución.
" f83b5c5bf413" es mi ID de contenedor y aquí está el ejemplo de trabajo de mi terminal:
fuente
Así es como configuro un usuario no root con la imagen base de
ubuntu:18.04
:Qué sucede con el código anterior:
foo
crea el usuario y el grupo .foo
se añade a la tanto lafoo
ysudo
grupo.uid
ygid
se establece en el valor de999
./home/foo
./bin/bash
.sed
comando no hace actualizaciones en línea para el/etc/sudoers
archivo para permitirfoo
yroot
usuarios sin contraseña de acceso alsudo
grupo.sed
comando deshabilita la#includedir
directiva que permitiría que cualquier archivo en subdirectorios anule estas actualizaciones en línea.fuente
Si tiene un contenedor ejecutándose como root que ejecuta un script (que no puede cambiar) que necesita acceso al
sudo
comando, simplemente puede crear un nuevosudo
script en su$PATH
que llame al comando pasado.Por ejemplo, en su Dockerfile:
fuente
-e
archivoecho
. De lo contrario, estará presente en el archivo en sí mismo, haciéndolo infuncional.sudo -E ls
. Intentará ejecutarlo-E ls
.Es posible que esto no funcione para todas las imágenes, pero algunas imágenes ya contienen un usuario raíz, como en la imagen jupyterhub / singleuser. Con esa imagen es simplemente:
fuente
Usa Alias.
Simple pero eficiente. No olvide agregarlo a ~ / .bash_aliases para que funcione después de abrir un nuevo shell.
Dado que el usuario es la raíz predeterminada en Docker, 'ignorar' el comando sudo es la forma más fácil.
fuente
A diferencia de la respuesta aceptada , yo uso
usermod
en su lugar.Suponga que ya inició sesión como root en Docker, y "fruit" es el nuevo nombre de usuario no root que quiero agregar, simplemente ejecute estos comandos:
Recuerde guardar la imagen después de la actualización. Utilícelo
docker ps
para obtener la <ID DE CONTENEDOR> y <IMAGEN> de la ventana acoplable en ejecución actual, luego ejecutedocker commit -m "added sudo user" <CONTAINER ID> <IMAGE>
para guardar la imagen de la ventana acoplable.Luego prueba con:
O pruebe mediante inicio de sesión directo (asegúrese de guardar la imagen primero) como ese usuario no root cuando inicie la ventana acoplable:
Puede usar
sudo -k
para restablecer la marca de tiempo de solicitud de contraseña:fuente