¿Cómo usar sudo dentro de un contenedor docker?


Normalmente, los contenedores docker se ejecutan usando el usuario root. Me gustaría usar un usuario diferente, lo cual no es un problema al usar la directiva de USUARIO de Docker. Pero este usuario debería poder usar sudo dentro del contenedor. Falta este comando.

Aquí hay un archivo 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 logueo con el usuario 'docker'. Cuando intento usar sudo, el comando no se encuentra. 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

5 answers

Acabo de entenderlo. Como regan señaló, tuve que agregar el usuario al grupo sudoers. Pero la razón principal era que había olvidado actualizar la caché de repositorios, por lo que apt-get no pudo encontrar el paquete sudo. Está funcionando ahora. Aquí está el código completo:

FROM ubuntu:12.04

RUN apt-get update && \
      apt-get -y install sudo

RUN useradd -m docker && echo "docker:docker" | chpasswd && adduser docker sudo

USER docker
CMD /bin/bash
 159
Author: drubb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-27 13:51:55

Las otras respuestas no funcionaron para mí. Seguí buscando y encontré una entrada de blog que cubría cómo un equipo estaba ejecutando no-root dentro de un contenedor docker.

Aquí está la versión TL; DR:

RUN apt-get update
RUN apt-get install sudo

RUN adduser --disabled-password --gecos '' docker
RUN adduser docker sudo
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers

USER docker

# this is where I was running into problems with the other approaches
RUN sudo apt-get update 

Estaba usando FROM node:9.3 para esto, pero sospecho que otras bases de contenedores similares también funcionarían.

 17
Author: M. Scott Ford,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-18 19:39:40

Cuando ni sudo ni apt-get están disponibles en el contenedor, también puede saltar al contenedor en ejecución como usuario root usando el comando

docker exec -u root -t -i container_id /bin/bash
 14
Author: Tomáš Záluský,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-28 08:46:06

Si desea conectarse al contenedor e instalar algo
usando apt-get
primero como la respuesta anterior de nuestro hermano "Tomáš Záluský"

docker exec -u root -t -i container_id /bin/bash

Entonces intenta

EJECUTE apt-get update o apt-get 'cualquier cosa que desee'

Funcionó conmigo espero que sea útil para todos

 6
Author: Ismail,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-29 10:31:59

Si tiene un contenedor ejecutándose como root que ejecuta un script (que no puede cambiar) que necesita acceso al comando sudo, simplemente puede crear un nuevo script sudo en su $PATH que llame al comando pasado.

Por ejemplo, en su Dockerfile:

RUN if type sudo 2>/dev/null; then \ 
     echo "The sudo command already exists... Skipping."; \
    else \
     echo -e "#!/bin/sh\n\${@}" > /usr/sbin/sudo; \
     chmod +x /usr/sbin/sudo; \
    fi
 1
Author: XtraSimplicity,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-02 01:27:29