Resolviendo los Errores de Permiso Denegado
Ahora que entendemos la causa del error de permiso denegado, exploremos varios métodos para resolverlo.
Método 1: Modificar los Permisos de Archivo en el Host
El enfoque más simple es cambiar los permisos de los archivos en su host para permitir que otros usuarios accedan a ellos:
chmod 755 ~/project/docker-test/testfile.txt
Esto cambia los permisos a 755 (-rwxr-xr-x), permitiendo que cualquiera lea y ejecute el archivo, pero solo el propietario puede modificarlo.
Intentemos acceder al archivo desde un contenedor de nuevo:
docker run --rm -v ~/project/docker-test:/app ubuntu cat /app/testfile.txt
Ahora debería ver el contenido del archivo:
This is a test file.
Esto funciona porque el archivo ahora es legible por "otros" en su sistema host, lo que incluye al usuario del contenedor.
Método 2: Usando la Bandera --user
Otro enfoque es indicarle a Docker que ejecute el contenedor con el mismo ID de usuario que su usuario host:
## Restablecer los permisos del archivo para que sean restrictivos
chmod 700 ~/project/docker-test/testfile.txt
## Obtener su ID de usuario y ID de grupo
USER_ID=$(id -u)
GROUP_ID=$(id -g)
## Ejecutar el contenedor con su ID de usuario
docker run --rm --user $USER_ID:$GROUP_ID -v ~/project/docker-test:/app ubuntu cat /app/testfile.txt
Ahora debería poder leer el contenido del archivo a pesar de sus permisos restrictivos:
This is a test file.
Esto funciona porque:
- Ejecutamos el contenedor con el mismo ID de usuario que su usuario host
- Los permisos en el archivo permiten el acceso a ese ID de usuario
- Docker pasa el ID de usuario a los procesos del contenedor
La bandera --user es particularmente útil cuando necesita mantener permisos restrictivos en sus archivos host.
Método 3: Ajustando los ID de Propietario y Grupo
Creemos un nuevo archivo propiedad de un usuario diferente para demostrar este método:
## Crear un archivo como root
sudo bash -c 'echo "This is a root-owned file." > ~/project/docker-test/rootfile.txt'
sudo chown root:root ~/project/docker-test/rootfile.txt
sudo chmod 600 ~/project/docker-test/rootfile.txt
## Veamos qué tenemos
ls -la ~/project/docker-test/
La salida debería mostrar:
total 16
drwxr-xr-x 2 labex labex 4096 XXX XX XX:XX .
drwxr-xr-x X labex labex 4096 XXX XX XX:XX ..
-rw------- 1 root root 25 XXX XX XX:XX rootfile.txt
-rwx------ 1 labex labex 19 XXX XX XX:XX testfile.txt
Ahora intente acceder al archivo propiedad de root desde un contenedor que se ejecuta como root:
docker run --rm -v ~/project/docker-test:/app ubuntu cat /app/rootfile.txt
Debería ver el contenido:
This is a root-owned file.
Esto funciona porque:
- El contenedor se ejecuta como root (UID 0) de forma predeterminada
- El archivo es propiedad de root (UID 0) en el host
- Los permisos (600) permiten al propietario leer el archivo
Esto demuestra que los ID de usuario reales importan, no solo los nombres. Cuando el ID de usuario del contenedor coincide con el ID de propietario del archivo, las comprobaciones de permisos tendrán éxito si el propietario tiene los permisos necesarios.