Je crée une image Docker pour mon application Symfony
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écutez le conteneur avec docker run -p 8080:80 myname/symfony_apps:latest
. Le journal Apache est inondé d'erreurs d'autorisation refusée, chose étrange que j'ai vérifiée avec ls -a
et les autorisations sont correctes. et quand je lance chmod depuis bash du conteneur, les problèmes de permission 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 des 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?
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:
COPY . /src
Et puis déplacez-le vers /var/www/html
et les autorisations de configuration (dans une commande RUN
):
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
J'ai également créé problème GitHub .
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 corriger facilement, notez avant et après la liste des répertoires
Step 7/9 : RUN /bin/bash -c 'ls -la; chmod +x gitlab-properties-builder.sh; ls -la'
---> Running in dc57ae77aa67
drwxr-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.jar
drwxr-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
Essayez d'ajouter:
USER root
Ça a marché pour moi.
Ce problème est probablement le résultat d'une définition VOLUME
à l'intérieur du Dockerfile en amont. Lorsqu'un volume est défini dans le Dockerfile, vous pouvez ajouter des fichiers avec une commande COPY
ou ADD
directement dans l'image. Cependant, une ligne RUN
:
RUN
, 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 garder)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.
Je viens de faire une expérience avec les éléments suivants:
FROM Alpine
LABEL MAINTAINER="YIMGA YIMGA Salathiel Genèse"
RUN apk add --no-cache inotify-tools
CMD [ "./script.sh" ]
WORKDIR /opt/app/
COPY src/ /opt/app/
RUN chmod a+x *.sh
Et cela fonctionne très bien.
Lorsque je remplace ce fichier exécutable par le biais de volumes de composition de docker, l'autorisation execute
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.