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

16

Estoy tratando de agregar un archivo a una imagen Docker creada a partir de la tomcatimagen oficial . Esa imagen no parece tener derechos de root, ya que estoy conectado como usuario tomcatsi ejecuto bash:

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

Si instruir a un Dockerfilecopiar un archivo a ese contenedor, el archivo tiene permisos 644y el propietario es root. Según tengo entendido, 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 tomcat:tomcat, aparece un Operation not permittederror.

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

Cómo se puede reproducir:

mkdir docker-addfilepermission
cd docker-addfilepermission
touch test.txt
echo 'FROM tomcat
COPY test.txt /usr/local/tomcat/webapps/
RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt' > Dockerfile

docker build .

La salida de docker build .:

Sending build context to Docker daemon 3.072 kB
Sending build context to Docker daemon 
Step 0 : FROM tomcat
 ---> 44859847ef64
Step 1 : COPY test.txt /usr/local/tomcat/webapps/
 ---> Using cache
 ---> a2ccb92480a4
Step 2 : RUN chown tomcat:tomcat /usr/local/tomcat/webapps/test.txt
 ---> Running in 208e7ff0ec8f
chown: changing ownership of '/usr/local/tomcat/webapps/test.txt': Operation not permitted
2014/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
nyi
fuente

Respuestas:

20

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

USER root

Si desea reducir 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 desde mi experiencia. Tiene sentido permitir que el usuario final deseado establezca la directiva del USUARIO como mejor le parezca.

thetrribletrivium
fuente
Esto de hecho funciona! ¿Sabe por casualidad por qué los comandos ADD y COPY crean archivos con el propietario root? ¿Por qué no toman USERen cuenta la directiva?
nyi
1
Bueno, normalmente no se ven imágenes base que configuran la directiva, ya que no hay una forma real de saber qué cuentas de usuario estarán en el sistema. También podría ser más fácil simplemente crear los archivos como raíz, ya que eso es lo que Docker tiene que ejecutar. Parece una solicitud de mejora razonable, simplificaría la creación de Dockerfiles si las cosas pudieran ser propiedad de lo establecido en la directiva del USUARIO.
theterribletrivium 01 de
Gracias. Realmente sácame de mi miseria. Necesitaba agregar claves ssh en una imagen de Jenkins.
Kostas Demiris
8

Desde Docker 17.09, se puede usar el --chownindicador en las operaciones ADD / COPY en Dockerfile para cambiar el propietario en el paso ADD / COPY en lugar de una operación RUN 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 en una carpeta provisional antes de crear la imagen.
  2. Ejecute el contenedor a través de un script de arranque que cambia la propiedad.
  3. ¡Aplasta las capas!
Vinayak Gadkari
fuente