web-dev-qa-db-fra.com

Comment réparer les autorisations de fichiers sur le contenu wp avec l'image officielle wordpress pour docker-compose

Problème


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. wordpress error unable to create directory

Ce que j'ai déjà fait


J'ai ensuite vérifié les autorisations de fichier à l'intérieur du conteneur, et c'était la sortie:

file permissions in the wordpress container

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.

Question


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?

10
Danny_DD

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"]
1
junsenbrnr

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).

  1. Créer un docker/wordpress dossier dans votre projet.
  2. Copiez les deux fichiers bruts ( Dockerfile et docker-entrypoint.sh ) de GitHub dans ce dossier.
  3. Remplacez ces lignes dans docker-entrypoint.sh :
        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
1
Michaël Perrin