¿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
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.
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
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
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
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