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.