Estoy creando una imagen de Docker para mi Symfony
aplicación y necesito dar permiso al servidor apache para escribir en la caché y las carpetas de registro
#Dockerfile
FROM php:7-apache
RUN apt-get update \
&& apt-get install -y libicu-dev freetds-common freetds-bin unixodbc \
&& docker-php-ext-install intl mbstring \
&& a2enmod rewrite
COPY app/php.ini /usr/local/etc/php/
COPY app/apache2.conf /etc/apache2/apache2.conf
COPY ./ /var/www/html
RUN 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 ejecuto el contenedor con docker run -p 8080:80 myname/symfony_apps:latest
. El registro de Apache está inundado por errores de permiso denegado, lo extraño con lo que he verificado 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
La situación
Ejecución de comandos chmod desde dockerfile: los permisos se cambian, pero apache aún se queja por el permiso denegado. Ejecutando chmod mismos comandos con bash dentro del contenedor: los permisos se cambian y mi aplicación se está ejecutando
¿Alguna idea, me falta algo, tal vez debería agregar un usuario root en algún lugar del Dockerfile?
fuente
apache2.conf
) no está causando un problema? ¿Los errores desaparecen si no los instalaapache2.conf
?Respuestas:
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:
Y luego muévalo
/var/www/html
y configure los permisos (en unRUN
comando):También creé el problema de GitHub .
fuente
El shell predeterminado de RUN en Docker es / bin / sh y aquí es donde los permisos que no se configuran correctamente realmente tienen un problema.
Pero puede cambiar simplemente usar / bin / bash en su lugar para solucionarlo fácilmente, observe antes y después del listado del directorio
fuente
/bin/bash -c 'chmod +x file'
funcionando y no/bin/sh -c 'chmod +x file'
?Intenta agregar:
Funcionó para mi.
fuente
Es probable que este problema sea el resultado de una
VOLUME
definición dentro del Dockerfile ascendente. Cuando se define un volumen en el Dockerfile, puede agregar archivos con un comandoCOPY
oADD
directamente en la imagen. Sin embargo, unaRUN
línea:RUN
comando, verá sus cambios aplicados, pero esos cambios se han aplicado al volumendocker diff
si no elimina los contenedores temporales (puede ejecutar una compilación--rm=false
para que permanezcan)Debido a este comportamiento, tiene las opciones para:
Tenga en cuenta que dentro de las imágenes php actuales, parece que se ha eliminado el volumen, lo que significa que efectivamente tenemos la opción 3.
fuente
Acabo de hacer un experimento con lo siguiente:
Y simplemente funciona muy bien.
sin embargo
Cuando anulo ese archivo ejecutable a través de volúmenes compuestos por docker, el
execute
permiso es simplemente como revertido: técnicamente anula el permiso de archivo original.La solución para el modo de desarrollo es simplemente
chmod a+x yourfile
desde el host, que se heredará al componer el montaje del volumen.fuente
docker run
comando y sin montajes de volumen externos.