May 29, 2022·Docker

Como resolver el error: signaling init process caused “permission denied” de Docker en Ubuntu 20.04

Hola muy buenas noches, publico esto de forma rápida porque estuve un buen rato en dar con la respuesta a un error y tal vez esto pueda ayudar a alguien.

Ya hace tiempo Docker 20.10.9 me estaba funcionando raro en Ubuntu 20.04. Cada vez que lo inicio mis contenedores ya se encuentran activos y se encuentran funcionales. Pero mi problema radica en que no puedo ni parar ni reiniciar los contenedores respectivos. La pila de error que obtengo es la siguiente:

Error response from daemon: Cannot kill container: e7f5789faa81: Cannot kill container e7f5789faa8158533f04be32cae010c86bfea9ead663f9c79fdfb20234c7dd0e: unknown error after kill: runc did not terminate sucessfully: container_linux.go:392: signaling init process caused "permission denied"

Probé diferentes posibles soluciones. Entre esas soluciones esta reiniciar el servicio de Docker y también probé reiniciar el daemon-reload, pero nada parecía estar funcionando y para colmo a la hora de querer eliminar los contenedores me encontraba devuelta con el error definido.

Estaba desesperado y devuelva de un lugar para otro preguntadome que estaba pasando, ¿POR QUE?

Me estaba frustrando ciertamente, caminaba de un lado a otro y me preguntaba por qué me estaba pasando esto. Y como si mi vida dependiera de ello me propuse indagar más en el asunto. Para comprender el error debemos entender que es AppArmor, este se trata de un módulo de Linux que permite al administrador del sistema restringir las capacidades de un programa asociando cada programa a un perfil de seguridad que puede ser creado manual o automáticamente.

En nuestro caso el error de Docker en cuestión sucede porque dicho perfil de seguridad se genera manualmente y es este mismo perfil el que nos impide hacer un stop o kill a nuestros contenedores. También cabe aclarar que AppArmor posee tres estados:

  • Unloaded: AppArmor no se encuentra activo en el Kernel
  • Running: AppArmor se encuentra activo y forzando ciertas policies en programas.
  • Stopped: AppArmor está activo en el Kernel, pero no está forzando ninguna policy.

Para conocer el estado de nuestro AppArmor podemos hacerlo primero averiguando si dicho servicio se encuentra activo en el kernel, esto lo podemos hacer de la siguiente manera:

systemctl --type=service

Ya con el background respectivo podemos proceder a que el comando que te va ayudar a resolver el problema es el siguiente:

sudo aa-remove-unknown

Lo que va a hacer este comando es fijarse los profiles en el directorio /etc/apparmor.d/ y compararlo con aquellos profiles generados automaticamente, entre aquellos cargados recientemente esta el docker-default que es un cuál a través de este comando el profile es listado y eliminado.