Saltar al contenido

¿Por qué chown no funciona en Dockerfile?

Te recomendamos que revises esta solución en un ambiente controlado antes de enviarlo a producción, un saludo.

Solución:

Respondiendo a mi propia pregunta: se declara que es un volumen. Si elimina la instrucción VOLUME, el chown surte efecto.

Además, si declaras el volumen después ejecutando chown, la configuración de chown permanecerá vigente.

Este blog http://container42.com/2014/11/03/docker-in depth-volumes/ explica este comportamiento en detalle.

Cada instrucción en el Dockerfile crea un nuevo contenedor. La instrucción realiza algunos cambios en este contenedor y se convierte en una nueva capa. Los cambios realizados en “/var/local/testrunner/logs” antes de que se realizara la instrucción VOLUME en el sistema de archivos del contenedor real. Sin embargo, después de la instrucción VOLUME, el directorio “/var/local/testrunner/logs” es el directorio montado. Los cambios realizados en este directorio después de la instrucción VOLUME se aplicarán en el directorio montado y no en el sistema de archivos del contenedor real.

Para cualquiera experimentando este problema sin volúmenesEncontré un trabajo intrincado alrededor.

Problema:

Con un Dockerfile simple de la siguiente manera:

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
COPY test_file.txt /home/new_user
RUN chown -R new_user:new_user /home/new_user
CMD ls -RFlag /home

Despues de correr:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

La salida fue:

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:39 ../
drwxr-xr-x 1 root 4096 Jun 15 21:39 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 root 4096 Jun 15 21:39 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 root  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 root 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 root  655 Jul 12  2019 .profile
-rw-r--r-- 1 root   28 Jun 11 19:48 test_file.txt

Como puede ver, la propiedad del archivo (por ejemplo, test_file.txt) todavía está asociada con el usuario root.

Solución:

Descubrí que si usaba un UID numérico en el chown comando, podía cambiar la propiedad, pero solo si el UID no era 1000. Así que agregué 1 al UID de new_user y luego cambió la propiedad.

FROM ubuntu:16.04
RUN useradd -m -d /home/new_user new_user
# change the uid of new_user to ensure it has whatever it was assigned plus 1 (e.g. if UID was 1000, now it'll be 1001)
RUN id -u new_user | awk 'print $1+1' | xargs -I usermod -u  new_user
COPY test_file.txt /home/new_user
RUN id -u new_user | xargs -I chown -R : /home/new_user
CMD ls -RFlag /home

Despues de correr:

echo "A file to test permissions." > test_file.txt
docker build -t chown-test -f Dockerfile .
docker run --rm -it chown-test

La salida fue:

/home:
total 12
drwxr-xr-x 1 root 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
drwxr-xr-x 1 1001 4096 Jun 15 21:37 new_user/

/home/new_user:
total 24
drwxr-xr-x 1 1001 4096 Jun 15 21:37 ./
drwxr-xr-x 1 root 4096 Jun 15 21:37 ../
-rw-r--r-- 1 1001  220 Aug 31  2015 .bash_logout
-rw-r--r-- 1 1001 3771 Aug 31  2015 .bashrc
-rw-r--r-- 1 1001  655 Jul 12  2019 .profile
-rw-r--r-- 1 1001   28 Jun 11 19:48 test_file.txt

No estoy seguro de por qué estaba teniendo este problema en primer lugar. Sin embargo, dado que parece que otros han tenido este problema, pensé en publicar mi solución. Mi caso de uso fue crear un contenedor docker que sirviera para un cuaderno jupyter. Creé un usuario no root para servir el cuaderno.

Calificaciones y reseñas

Nos puedes añadir valor a nuestro contenido informacional tributando tu veteranía en las referencias.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *