Je crée une image Docker pour mon Symfony
application et je dois autoriser le serveur Apache à écrire dans les dossiers de cache et de journal
#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
Lorsque je crée cette image avec docker build -t myname/symfony_apps:latest .
et exécute le conteneur avec docker run -p 8080:80 myname/symfony_apps:latest
. Le journal Apache est inondé d'erreurs d'autorisation refusée, la chose étrange avec laquelle j'ai vérifié ls -a
et les autorisations sont très bien. et quand j'exécute chmod depuis bash du conteneur, les problèmes d'autorisation apache ont disparu et l'application fonctionne bien
La situation
Exécution des commandes chmod à partir de dockerfile: les autorisations sont modifiées mais apache se plaint toujours de l'autorisation refusée. Exécution de mêmes commandes chmod avec bash à l'intérieur du conteneur: les autorisations sont modifiées et mon application est en cours d'exécution
Une idée, est-ce que je manque quelque chose, peut-être devrais-je ajouter un utilisateur root quelque part dans le Dockerfile?
la source
apache2.conf
) ne pose pas de problème? Les erreurs disparaissent-elles si vous n'installez pasapache2.conf
?Réponses:
J'ai eu le même problème et il semble qu'il y ait un bug dans docker ou overlay2 si le contenu du répertoire est créé dans une couche et ses autorisations sont modifiées dans l'autre.
Pour contourner ce problème, vous pouvez copier les sources dans un répertoire temporaire:
Ensuite, déplacez-le
/var/www/html
et configurez les autorisations (dans une seuleRUN
commande):J'ai également créé le problème GitHub .
la source
Le shell par défaut de RUN dans Docker est / bin / sh et c'est là que les autorisations qui ne sont pas définies correctement ont réellement un problème.
Mais vous pouvez changer pour utiliser simplement / bin / bash à la place pour facilement corriger, remarquer avant et après la liste des répertoires
la source
/bin/bash -c 'chmod +x file'
marche et pas/bin/sh -c 'chmod +x file'
?Essayez d'ajouter:
Ça a marché pour moi.
la source
Ce problème est probablement le résultat d'une
VOLUME
définition à l'intérieur du Dockerfile en amont. Lorsqu'un volume est défini dans le Dockerfile, vous pouvez ajouter des fichiers avec une commandeCOPY
ouADD
directement dans l'image. Cependant, uneRUN
ligne:RUN
commande, vous verrez vos modifications appliquées, mais ces modifications ont été appliquées au volumedocker diff
si vous ne supprimez pas les conteneurs temporaires (vous pouvez exécuter une génération avec--rm=false
pour les conserver)En raison de ce comportement, vous avez les options suivantes:
Notez qu'à l'intérieur des images php actuelles, il semble que le volume a été supprimé, ce qui signifie que nous avons effectivement l'option 3.
la source
Je viens de faire une expérience avec les éléments suivants:
Et cela fonctionne très bien.
pourtant
Lorsque je remplace ce fichier exécutable via des volumes de composition de docker, l'
execute
autorisation est tout simplement comme annulée - techniquement remplacée par l'autorisation de fichier d'origine.Le correctif pour le mode dev est simplement
chmod a+x yourfile
de l'hôte, qui sera hérité lors du montage du volume de composition.la source
docker run
commande et aucun montage de volume externe.