Cómo agregar un archivo a un contenedor docker que no tiene permisos de root?

Estoy tratando de agregar un archivo a una imagen de Docker creada a partir del oficial tomcat imagen. Esa imagen no parece tener derechos de root, ya que estoy conectado como usuario tomcat si corro bash:

docker run -it tomcat /bin/bashtomcat@06359f7cc4db:/usr/local/tomcat$ 

Si instruyo a un Dockerfile para copiar un archivo en ese contenedor, el archivo tiene permisos 644 y el dueño es root. Por lo que entiendo, eso parece ser razonable ya que todos los comandos en el Dockerfile se ejecutan como root. Sin embargo, si intento cambiar la propiedad de ese archivo a tomcat:tomcat, Tengo un Operation not permitted error.

¿Por qué no puedo cambiar los permisos de un archivo copiado en esa imagen?

Cómo se puede reproducir:

mkdir docker-addfilepermissioncd docker-addfilepermissiontouch test.txtecho 'FROM tomcatCOPY test.txt /usr/local/tomcat/webapps/RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfiledocker build .

La salida de docker build .:

Sending build context to Docker daemon 3.072 kBSending build context to Docker daemon Step 0 : FROM tomcat ---> 44859847ef64Step 1 : COPY test.txt /usr/local/tomcat/webapps/ ---> Using cache ---> a2ccb92480a4Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt ---> Running in 208e7ff0ec8fchown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted2014/11/01 00:30:33 The command [/bin/sh -c chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt] returned a non-zero code: 1

Es probable que haya una forma de ver y cambiar el Dockerfile para tomcat, pero no puedo entenderlo después de unos minutos. Mi solución poco elegante es agregar esta línea antes del chown:

USER root

Si desea deselevar los privilegios después (lo cual se recomienda), puede agregar esta línea:

USER tomcat

Alternativamente, trabaje con una imagen que no tenga software instalado para que pueda comenzar su Dockerfile como root e instalar tomcat y todo eso. En realidad, es extraño que cambien eso en su imagen por mi experiencia. Tiene sentido permitir que el usuario final previsto establezca la directiva de USUARIO como mejor le parezca.

Desde Docker 17.09 se puede usar el --chown marque las operaciones de AGREGAR/COPIAR en Dockerfile para cambiar el propietario en el paso de AGREGAR/COPIAR en lugar de una operación de EJECUCIÓN separada con chown que aumenta el tamaño de la imagen como ha notado. Hubiera sido bueno tener esto como el modo predeterminado, es decir, los permisos del usuario que copia los archivos se aplican a los archivos copiados. Sin embargo, el equipo de Docker no quería romper la compatibilidad con versiones anteriores y, por lo tanto, introdujo una nueva bandera.

COPY --chown=<user>:<group> <hostPath> <containerPath>

Las otras alternativas son:

  1. Cambie el permiso de una carpeta de ensayo antes de crear la imagen.
  2. Ejecute el contenedor a través de un script de arranque que cambie la propiedad.
  3. Aplasta las capas!