chmod no funciona correctamente en Docker

Estoy creando una imagen de Docker para mi Symfony la aplicación y yo necesitamos dar permiso al servidor apache para escribir en la caché y las carpetas de registro

#DockerfileFROM php:7-apacheRUN apt-get update \&& apt-get install -y libicu-dev  freetds-common freetds-bin unixodbc \&& docker-php-ext-install intl mbstring \&& a2enmod rewriteCOPY app/php.ini /usr/local/etc/php/COPY app/apache2.conf /etc/apache2/apache2.confCOPY ./ /var/www/htmlRUN find /var/www/html/ -type d -exec chmod 755 {} \; RUN find /var/www/html/ -type f -exec chmod 644 {} \;RUN chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

Cuando construyo esta imagen con docker build -t myname/symfony_apps:latest . y ejecute el contenedor con docker run -p 8080:80 myname/symfony_apps:latest.El registro de Apache está inundado de errores de permiso denegado , lo extraño que he comprobado con ls -a y los permisos están bien. y cuando ejecuto chmod desde bash del contenedor , los problemas de permisos de Apache desaparecen y la aplicación funciona bien

Situación

Ejecución de comandos chmod desde dockerfile: los permisos se cambian, pero apache aún se queja de permiso denegado.Ejecución de los mismos comandos chmod con bash dentro del contenedor: se cambian los permisos y mi aplicación se está ejecutando

¿Alguna idea , me estoy perdiendo algo, tal vez debería agregar el usuario root en algún lugar del Dockerfile ?

Tuve el mismo problema y parece que hay algún error en docker o overlay2 si el contenido del directorio se crea en una capa y sus permisos se cambian en otra.

Como solución alternativa, puede copiar las fuentes al directorio temporal:

COPY . /src

Y luego muévelo a /var/www/html y permisos de configuración (en uno RUN comando):

RUN rm -rf /var/www/html && mv /src /var/www/html &&\    find /var/www/html/ -type d -exec chmod 755 {} \; &&\    find /var/www/html/ -type f -exec chmod 644 {} \; &&\    chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

También creé Problema de GitHub.

Intente agregar :

USER root

Funcionó para mí.

El shell predeterminado de RUN en Docker es /bin / sh y aquí es donde los permisos que no se configuran correctamente en realidad tienen un problema.

Pero puede cambiar para usar /bin / bash en su lugar para arreglar fácilmente, observe antes y después de la lista de directorios

Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'---> Running in dc57ae77aa67drwxr-xr-x. 3 root root      103 Mar  8 17:56 .drwxr-xr-x. 1 root root       46 Mar  8 17:57 ..drwxr-xr-x. 2 root root        6 Mar  7 20:47 config-rw-r--r--. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jardrwxr-xr-x. 1 root root       42 Mar  8 17:56 .drwxr-xr-x. 1 root root       61 Mar  8 17:57 ..drwxr-xr-x. 2 root root        6 Mar  7 20:47 config-rwxr-xr-x. 1 root root     2340 Mar  7 21:20 gitlab-properties-builder.sh-rw-r--r--. 5 root root 57325770 Mar  5 14:39 gitlab-scm-collector-2.0.5-SNAPSHOT.jar---> 8b5de6e348d3

Este problema es probablemente el resultado de un VOLUME definición dentro del Dockerfile ascendente. Cuando se define un volumen en Dockerfile, puede agregar archivos con un COPY o ADD comando directamente en la imagen. Sin embargo, a RUN línea:

  • Cree un contenedor temporal utilizando la definición de imagen a partir del punto actual del dockerfile
    • Ese contenedor temporal tendrá un volumen anónimo montado como usted o una imagen principal especificada dentro del Dockerfile
    • El volumen anónimo se inicializará a partir del contenido de la imagen
  • Su comando se ejecutará dentro del contenedor
    • Si enumera el directorio durante este RUN comando, verá los cambios aplicados, pero esos cambios se han aplicado al volumen
  • Cuando se complete el comando ejecutar, docker capturará los cambios en el contenedor
    • Estos cambios se pueden ver con un docker diff si no elimina los contenedores temporales (puede ejecutar una compilación con --rm=false para que permanezcan)
    • Estos cambios no incluirán el contenido anónimo del volumen porque no existe dentro del sistema de archivos contenedor temporal, los volúmenes están separados

Debido a este comportamiento, tiene las opciones de:

  1. puede copiar sus archivos a un directorio diferente y cambiar los permisos allí
  2. puede corregir los permisos en su host para que se copien con esos permisos directamente
  3. puede eliminar el volumen de su imagen, hacer que la imagen ascendente elimine su definición de volumen o puede reconstruir su propia copia de la imagen ascendente sin la definición de volumen y basar sus imágenes en eso

Tenga en cuenta que dentro de las imágenes php actuales, parece que el volumen se ha eliminado, lo que significa que efectivamente tenemos la opción 3.

Acabo de hacer un experimento con lo siguiente:

FROM alpineLABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"RUN apk add --no-cache inotify-toolsCMD [ "./script.sh" ]WORKDIR /opt/app/COPY src/ /opt/app/RUN chmod a+x *.sh

Y funciona de maravilla.

Obstante

Cuando anulo ese archivo ejecutable a través de volúmenes docker-compose, el execute el permiso es simplemente como un retroceso, técnicamente anulado al permiso de archivo original.

La solución para el modo de desarrollo es simplemente chmod a+x yourfile del host, que se heredará en el montaje del volumen de composición.

Vale… He editado la pregunta :slight_smile:

Veo un espacio extra en tu último comando (estoy en mi teléfono, así que no puedo estar seguro). Como el problema de permisos parece estar en el directorio de registro, cambie la última línea a: ``
EJECUTAR chmod -R 777 /var/www/html/app/cache /var/www/html/app/logs

ese espacio extra era un error tipográfico

¿Resolviste el problema?

No puedo reproducir su problema. Si uso su dockerfile y configuro algunos archivos ficticios localmente,los permisos son correctos y todo Funciona. Puedo arrancar un contenedor y acceder al contenido a través de un navegador web. ¿Puede actualizar su pregunta para incluir mensajes de error específicos? Está seguro de su configuración de Apache ('apache2.conf) no está causando un problema? Los errores desaparecen si no install apache2.conf?

Sería útil ver el comando de Docker que ejecuta la imagen creada.