Gestión de permisos de montaje de volúmenes
Los volúmenes de Docker permiten compartir datos entre el host y los contenedores. Sin embargo, gestionar correctamente los permisos al utilizar volúmenes es importante para evitar problemas. En este paso, aprenderemos cómo manejar los permisos al utilizar montajes de volúmenes.
Comprensión de los problemas de permisos de montaje de volúmenes
El principal desafío con los montajes de volúmenes de Docker es que los IDs de usuario dentro del contenedor pueden no coincidir con los IDs de usuario en el sistema host. Esto puede provocar problemas de permisos al acceder a archivos en volúmenes montados.
Demostremos este problema con un ejemplo sencillo.
Primero, cree un nuevo directorio en el host que montaremos en un contenedor:
mkdir -p ~/project/host-data
cd ~/project/host-data
Cree un archivo de prueba en este directorio:
echo "This is a test file created on the host" > host-file.txt
Verifique la propiedad de este archivo:
ls -l host-file.txt
Debería ver que el archivo es propiedad del usuario labex
(su usuario actual en el host):
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
Ahora, ejecutemos un contenedor que monte este directorio y tratemos de modificar el archivo:
docker run -it --rm -v ~/project/host-data:/container-data ubuntu:22.04 bash
Ahora está dentro del contenedor. Verifiquemos la propiedad del archivo montado:
ls -l /container-data/host-file.txt
Puede ver una salida similar a:
-rw-r--r-- 1 1000 1000 39 May 15 13:00 /container-data/host-file.txt
Note que el archivo muestra IDs numéricos en lugar de nombres de usuario porque el contenedor no conoce al usuario labex
del host.
Intente crear un nuevo archivo en el directorio montado:
echo "This is a test file created in the container" > /container-data/container-file.txt
Ahora, verifique la propiedad de este nuevo archivo:
ls -l /container-data/container-file.txt
Debería ver:
-rw-r--r-- 1 root root 47 May 15 13:05 /container-data/container-file.txt
El archivo es propiedad del usuario root
dentro del contenedor (ya que estamos ejecutando como root por defecto).
Salga del contenedor:
exit
Ahora, verifique la propiedad de ambos archivos en el host:
ls -l ~/project/host-data/
Verá que el archivo creado desde dentro del contenedor es propiedad de root
en el host:
-rw-r--r-- 1 root root 47 May 15 13:05 container-file.txt
-rw-r--r-- 1 labex labex 39 May 15 13:00 host-file.txt
Esto puede provocar problemas de permisos si un usuario no root en el host necesita acceder o modificar estos archivos.
Solución de problemas de permisos de volúmenes
Hay varias formas de resolver los problemas de permisos de volúmenes. Exploremos algunos enfoques comunes.
Enfoque 1: Establecer el usuario en el Dockerfile para que coincida con el usuario del host
Cree un nuevo directorio para este ejemplo:
mkdir -p ~/project/volume-permissions
cd ~/project/volume-permissions
Cree un nuevo Dockerfile:
nano Dockerfile
Agregue el siguiente contenido:
FROM ubuntu:22.04
## Create a user with the same UID as the host user
RUN useradd -m -u 1000 appuser
## Create app directory and set ownership
RUN mkdir -p /app/data && chown -R appuser:appuser /app
## Set working directory
WORKDIR /app
## Switch to appuser
USER appuser
## Command to run
CMD ["bash", "-c", "echo 'I can write to the mounted volume' > /app/data/test.txt && tail -f /dev/null"]
Guarde y salga del editor.
Construya la imagen:
docker build -t volume-permissions-image .
Cree un directorio en el host para realizar pruebas:
mkdir -p ~/project/volume-permissions/host-data
Ejecute un contenedor con el volumen montado:
docker run -d --name volume-test -v ~/project/volume-permissions/host-data:/app/data volume-permissions-image
Después de un momento, verifique la propiedad del archivo creado en el host:
ls -l ~/project/volume-permissions/host-data/
Debería ver que el archivo es propiedad de un usuario con UID 1000, que debería coincidir con el UID de su usuario en el host:
-rw-r--r-- 1 labex labex 35 May 15 13:15 test.txt
Este enfoque funciona porque creamos un usuario en el contenedor con el mismo UID que el usuario del host.
Enfoque 2: Utilizar la bandera --user
Otro enfoque es utilizar la bandera --user
para especificar qué ID de usuario utilizar al ejecutar el contenedor.
Primero, limpie el contenedor anterior:
docker stop volume-test
docker rm volume-test
Ahora ejecute un contenedor con la bandera --user
:
docker run -d --name user-flag-test --user "$(id -u):$(id -g)" -v ~/project/volume-permissions/host-data:/data ubuntu:22.04 bash -c "echo 'Created with --user flag' > /data/user-flag-test.txt && sleep 3600"
Este comando ejecuta el contenedor con su ID de usuario y ID de grupo actuales.
Verifique la propiedad del nuevo archivo:
ls -l ~/project/volume-permissions/host-data/user-flag-test.txt
Debería ver que el archivo es propiedad de su usuario en el host:
-rw-r--r-- 1 labex labex 23 May 15 13:20 user-flag-test.txt
Limpiemos antes de pasar al siguiente paso:
docker stop user-flag-test
docker rm user-flag-test
Estos enfoques demuestran cómo gestionar los permisos al utilizar volúmenes de Docker. Al hacer coincidir los IDs de usuario entre el contenedor y el host, se pueden evitar problemas de permisos al compartir datos entre ellos.