J'utilise Docker pour exécuter une instance Apache. Mon fichier Docker ressemble à ceci:
FROM ubuntu
MAINTAINER [email protected]
RUN cat /etc/passwd
RUN cat /etc/group
RUN apt-get update && apt-get install -yq Apache2 php5 libapache2-mod-php5 php5-mysql
RUN apt-get install -yq openssh-server
RUN mkdir /var/run/sshd
ENV Apache_RUN_USER www-data
ENV Apache_RUN_GROUP www-data
ENV Apache_LOG_DIR /var/log/Apache2
EXPOSE 80
ADD config/Apache2/000-default.conf /etc/Apache2/sites-available/000-default.conf
ADD config/php5/php.ini /etc/php5/Apache2/php.ini
ADD config/start.sh /tmp/start.sh
ADD src /var/www
RUN chown -R root:www-data /var/www
RUN chmod u+rwx,g+rx,o+rx /var/www
RUN find /var/www -type d -exec chmod u+rwx,g+rx,o+rx {} +
RUN find /var/www -type f -exec chmod u+rw,g+rw,o+r {} +
#essentially: CMD ["/usr/sbin/Apache2ctl", "-D", "FOREGROUND"]
CMD ["/tmp/start.sh"]
Cependant, lorsque je crée le conteneur et l'exécute, je n'obtiens que 403 erreurs.
Notez que j'ai spécifié qu'Apache doit s'exécuter en tant que www-data
Dans le groupe www-data
, Et que/var/www a été récursivement chown
d pour appartenir à root:www-data
.
En outre, tous les répertoires sont consultables et lisibles, et tous les fichiers sont lisibles et inscriptibles par le groupe www-data (enfin, selon ls -la et namei -m, ils le sont de toute façon).
Comment résoudre ces problèmes d'autorisations? Je ne peux pas comprendre.
Erreur réelle du fichier Apache error.log:
[Fri May 23 18:33:27.663087 2014] [core:error] [pid 14] (13)Permission denied: [client 11.11.11.11:61689] AH00035: access to /index.php denied (filesystem path '/var/www/index.php') because search permissions are missing on a component of the path
[~ # ~] modifier [~ # ~] :
sortie de ls -laR /var/www
à la fin du Dockerfile:
Step 21 : RUN ls -laR /var/www
---> Running in 74fd3609dfc8
/var/www:
total 1036
drwxr-xr-x 67 root www-data 4096 May 23 18:38 .
drwxr-xr-x 26 root root 4096 May 23 18:38 ..
-rw-rw-r-- 1 root www-data 28 May 23 12:22 .gitignore
-rw-rw-r-- 1 root www-data 501 May 23 12:22 .htaccess
-rw-rw-r-- 1 root www-data 7566 May 23 12:22 index.php
Sortie de namei -m /var/www/index.php
À la fin du Dockerfile:
Step 22 : RUN namei -m /var/www/index.php
---> Running in 1203f0353090
f: /var/www/index.php
drwxr-xr-x /
drwxr-xr-x var
drwxr-xr-x www
-rw-rw-r-- index.php
EDIT2
Après avoir essayé tout un tas de choses, y compris chmod -R 777
Juste pour voir si je pouvais faire fonctionner quoi que ce soit , j'ai essayé de mettre les fichiers source ajouté à partir du Dockerfile dans /var/www/html
, l'emplacement par défaut pour les fichiers Apache à servir.
J'ai fait correspondre exactement les autorisations de fichier par défaut (je pense), et cela ne fonctionne toujours pas. Le fichier index.html par défaut fourni avec Apache se charge très bien, mais le dossier src
ajouté a toujours une erreur 403
D'accès refusé.
J'ai changé le Dockerfile en ADD src /var/www/html/src
Et les autorisations ont été définies en utilisant:
RUN find /var/www/html -type d -exec chmod u+rwx,g+rx,o+rx {} +
RUN find /var/www/html -type f -exec chmod u+rw,g+r,o+r {} +
Pas de chance. Ci-dessous, une partie de la sortie de ls -laR
Sur /var/www
. Notez que les autorisations pour le dossier html
et index.html
Fournies avec une installation Apache2
Correspondent à celles du dossier src
ajouté:
Step 19 : RUN ls -laR /var/www/
---> Running in 0520950d0426
/var/www/:
total 12
drwxr-xr-x 6 root root 4096 May 23 19:23 .
drwxr-xr-x 24 root root 4096 May 23 19:23 ..
drwxr-xr-x 5 root root 4096 May 23 19:23 html
/var/www/html:
total 24
drwxr-xr-x 5 root root 4096 May 23 19:23 .
drwxr-xr-x 6 root root 4096 May 23 19:23 ..
-rw-r--r-- 1 root root 11510 May 23 18:28 index.html
drwxr-xr-x 47 root root 4096 May 23 19:23 src
/var/www/html/src:
total 1032
drwxr-xr-x 47 root root 4096 May 23 19:23 .
drwxr-xr-x 5 root root 4096 May 23 19:23 ..
-rw-r--r-- 1 root root 28 May 23 12:22 .gitignore
-rw-r--r-- 1 root root 501 May 23 12:22 .htaccess
-rw-r--r-- 1 root root 7566 May 23 12:22 index.php
Peut-être que chmod
ne fonctionne pas exactement comme je le pensais ??
EDIT3
Une dernière information. Le conteneur Docker est en cours de construction par buildbot, dont je suppose qu'il s'exécute en tant que root. Je n'ai pas pu reproduire ce scénario sans utiliser buildbot pour faire le bâtiment.
Tout construire via les commandes de type Sudo docker build -t Apache .
Sur mon ordinateur portable fonctionne bien, mais les problèmes surviennent lorsque buildbot le fait. Je ne sais pas pourquoi: ^ /
Je viens de tomber sur cela après avoir posté une question similaire sur Exécution de l'application dans Docker en tant qu'utilisateur non root .
Je suppose que vous ne pouvez pas chmod/chown fichiers qui ont été ajoutés via la commande ADD. - thom_nic 19 juin à 14:14
En fait, vous le pouvez. Vous avez juste besoin d'émettre une commande RUN après l'ADD pour l'emplacement du fichier qui sera À L'INTÉRIEUR de votre conteneur. Par exemple
ADD extras/dockerstart.sh /usr/local/servicemix/bin/
RUN chmod 755 /usr/local/bin/dockerstart.sh
J'espère que cela pourra aider. Ça a marché pour moi.
J'ai rencontré un problème similaire; cependant, mon conteneur utilisait VOLUME
pour mapper les répertoires à travers le conteneur.
Modification des autorisations sur le répertoire mappé sur /var/www/html
lui-même a corrigé les erreurs 403 interdites.
docker-Host$ ls -ld /var/www/html
drwxr--r-- 53 me staff 1802 Mar 8 22:33 .
docker-Host$ chmod a+x /var/www/html
docker-Host$ ls -ld /var/www/html
drwxr-xr-x 53 me staff 1802 Mar 8 22:33 .
Notez que chmod
doit être appliqué sur l'hôte Docker, pas dans le conteneur. L'exécuter dans le conteneur n'apporte aucune modification au répertoire.
docker-container$ chmod a+x /var/www/html
docker-container$ ls -ld /var/www/html
drwxr--r-- 53 me staff 1802 Mar 8 22:33 .