Docker Copiar y cambiar propietario


Dado el siguiente Dockerfile

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
MKDIR /data
COPY test/ /data/test data
RUN chown -R john:mygroup /data
CMD /bin/bash

En mi directorio de prueba, que se copia, he establecido los permisos de archivo en 770.

Si hago un su john dentro de mi contenedor, no puedo acceder a ninguno de los archivos o subdirectorios en mi directorio de prueba. Parece que este problema está relacionado con la propiedad en el sistema de archivos aufs, donde el directorio copiado todavía es propiedad de root y los permisos se establecen en 770.

¿Hay alguna solución para este problema para establecer los permisos correctamente? Una podría ser establecer los permisos del directorio original al uid del usuario contenedor antes de copiarlo. Pero esto parece más un truco.

Author: Christian Metzler, 2015-03-05

2 answers

Finalmente se ha agregado una bandera --chown a COPY:

COPY --chown=patrick hostPath containerPath

Esta nueva sintaxis parece funcionar en Docker 17.09.

Ver el PR para más información.

 42
Author: Georgi Hristozov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-02-03 19:26:27

Creo que encontré una solución, que funciona. El uso de un contenedor de volumen de datos hará el truco. Primero creo el Contenedor de Volumen de Datos, que contiene la copia de mi directorio externo:

FROM busybox
RUN mkdir /data
VOLUME /data
COPY /test /data/test
CMD /bin/sh

En mi contenedor de aplicaciones, donde tengo a mis usuarios, que podrían verse algo como esto

FROM ubuntu
RUN groupadd mygroup
RUN useradd -ms /bin/bash -G mygroup john
COPY setpermissions.sh /root/setpermissions.sh
CMD /root/setpermissions.sh && /bin/bash

El script setpermissions hace el trabajo de establecer los permisos de usuario:

#!/bin/bash

if [ ! -e /data/.bootstrapped ] ; then
  chown -R john:mygroup /data
  touch /data/.bootstrapped
fi

Ahora solo tengo que usar el --volumes-from <myDataContainerId> al ejecutar el contenedor de la aplicación.

 6
Author: Christian Metzler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-06 07:58:44