Je configure un Wordpress environnement local avec docker-compose et l'image officielle wordpress du référentiel docker.
Je suis sous Windows.
Le problème est que j'ai des problèmes de premissions sur le contenu wp, et je ne suis pas en mesure de télécharger des fichiers depuis mon panneau d'administration Wordpress.
J'ai ensuite vérifié les autorisations de fichier à l'intérieur du conteneur, et c'était la sortie:
Comme vous pouvez le voir, le propriétaire de mon wp-content
est root
au lieu de www-data
.
La solution immédiate consiste à ouvrir le bash du conteneur et à donner chown -R www-data:www-data /var/www/html/wp-content/
Bien sûr, cela fonctionne, mais je ne veux pas faire ce processus chaque fois que je démarre un nouveau projet wordpress. Pour y parvenir, j'ai créé un Dockerfile
comme ceci:
FROM wordpress:5.1.1
# install dos2unix (fix problem between CRLF and LF)
RUN apt-get update
RUN apt-get install -y dos2unix
# increase upload limit
RUN touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini
# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Et mon entrypoint.sh
ressemble à ça:
#!/bin/bash
echo Fixing permissions...
chown -R www-data:www-data /var/www/html/wp-content/
Mais je me suis alors rendu compte que j'étais en train de remplacer le ENTRYPOINT
de l'image originale wordpress, et le conteneur se terminait toujours par code 0
.
Ensuite, j'ai essayé avec CMD
au lieu de ENTRYPOINT
, et j'ai changé mon Dockerfile
comme ceci:
FROM wordpress:5.1.1
# increase upload limit
RUN touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini
CMD chown -R www-data:www-data /var/www/html/wpcontent/
Mais je reçois toujours l'erreur que le fichier ou le dossier n'existe pas.
J'ai essayé d'utiliser CMD
aussi comme ceci:CMD ["chown", "-R", "www-data:www-data", "/var/www/html/wp-content/"]
mais sans succès.
Il existe un moyen d'exécuter une commande après l'original ENTRYPOINT
?
Connaissez-vous autrement une meilleure façon de résoudre ce problème?
D'après la documentation de Docker, la commande que vous devez utiliser est RUN
.
Ne confondez pas RUN avec CMD. RUN exécute en fait une commande et valide le résultat; CMD n'exécute rien au moment de la génération, mais spécifie la commande prévue pour l'image.
La ligne de votre Dockerfile doit donc être: RUN chown -R www-data:www-data /var/www/html/wp-content
De plus, pour diminuer le nombre de calques créés et la taille de votre image, je chaînerais autant de commandes RUN
que possible. Par exemple (non testé):
FROM wordpress:5.1.1
# install dos2unix (fix problem between CRLF and LF) and increase upload limit
RUN apt-get update -y && \
apt-get install -y dos2unix && \
touch /usr/local/etc/php/conf.d/uploads.ini \
&& echo "upload_max_filesize = 10M;" >> /usr/local/etc/php/conf.d/uploads.ini && \
chown -R www-data:www-data /var/www/html/wp-content
# fix permissions issues
COPY entrypoint.sh /
RUN dos2unix /entrypoint.sh && \
chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
Cela est dû à la façon dont l'image WordPress Docker est créée.
J'ai créé un Pull Request pour faire le wp-content
le dossier appartient à www-data
lorsqu'il est (ou certains de ses sous-dossiers) partagé à l'aide d'un volume.
Avant sa fusion (si c'est le cas), vous pouvez créer votre propre image WordPress Docker pour intégrer ma modification. Prenez l'un des dossiers sur https://github.com/ docker-library/wordpress (choisissez PHP, puis paramètres du serveur Web).
docker/wordpress
dossier dans votre projet. if [ "$(id -u)" = '0' ] && [ "$(stat -c '%u:%g' .)" = '0:0' ]; then
chown "$user:$group" .
fi
par:
if [ "$(id -u)" = '0' ]; then
chown -R "$user:$group" .
fi