¿Cómo docker COPY como no root?

143

Al crear una imagen de Docker, ¿cómo agrego COPYun archivo a la imagen para que el archivo resultante sea propiedad de un usuario que no sea root?

FGreg
fuente

Respuestas:

206

Para versiones v17.09.0-ce y posteriores

Use la bandera opcional --chown=<user>:<group>con los comandos ADDo COPY.

Por ejemplo

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

La documentación para el indicador --chown ahora está activa en la página principal de referencia de Dockerfile .

El número 34263 se ha fusionado y está disponible en la versión v17.09.0-ce .


Para versiones anteriores a v17.09.0-ce

Docker no es compatible COPYcomo usuario que no sea root. Necesita chown/ chmodel archivo después del COPYcomando.

Dockerfile de ejemplo:

from centos:6
RUN groupadd -r myuser && adduser -r -g myuser myuser
USER myuser
#Install code, configure application, etc...
USER root
COPY run-my-app.sh /usr/local/bin/run-my-app.sh
RUN chown myuser:myuser /usr/local/bin/run-my-app.sh && \
    chmod 744 /usr/local/bin/run-my-app.sh
USER myuser
ENTRYPOINT ["/usr/local/bin/run-my-app.sh"]

Antes de v17.09.0-ce, la referencia de Dockerfile para el COPYcomando decía:

Todos los archivos y directorios nuevos se crean con un UID y GID de 0.


Historial Esta función ha sido rastreada a través de múltiples problemas de GitHub: 6119 , 9943 , 13600 , 27303 , 28499 , problema 30110 .

El problema 34263 es el problema que implementó la funcionalidad de marca opcional y el problema 467 actualizó la documentación.

FGreg
fuente
3
Esto es frustrante, ya que la creación de una gran cantidad de archivos se ha vuelto increíblemente lenta desde que overlay2 se ha convertido en el controlador de almacenamiento predeterminado
hbogert
1
Sí, además, crea una gran capa de imagen adicional sin razón aparente (en mi caso:> 300 MB para ejecutarse chownen 40 MB de archivos).
Dirk
También hay un beneficio para ejecutar chown junto con el comando COPY, que es la reducción de tamaño. Si ejecutamos esos dos comandos por separado (COPY <host_path> <source_path>; chown other_user: other_user), se creó una capa adicional que finalmente duplica el tamaño de la imagen.
abhishek thakur
Esta respuesta es un salvavidas. Muchas gracias, resolvió un problema que había estado luchando durante unas horas.
Colby Hill