Show all projects!

PHP Docker container so laufen lassen, das Mac/Linux und Windows User keine Schreibrechteprobleme haben

Problemstellung

Wenn man als Team einen lokalen Entwicklungsworkspace für PHP Projekte mit Docker betreibt, hat man, wenn mehrere Betriebssysteme eingesetzt werden, das Problem, dass nicht auf allen Betriebssystemen die Dateirechte ignoriert werden (was ja eigentlich richtig ist). Das führt unter Linux z.B. dazu, wenn man in einen Docker container via docker-compose exec geht und dort eine Datei anlegt, diese als Root oder als der Prozessuser der als Standard definiert wird (z.b www-data), im Hostdateisystem angelegt wird.

 

Um das Problem unter Linux zu umgehen, muss man sich im Container mit derselben UserID (UID) bewegen, die man auch auf dem Host-Bewerbeitssystem hat (üblicherweise für den ersten „normalen“ Benutzer eines Systems die UID 1000). Allerdings kann es natürlich auch eine andere UID sein, und man muss daher die UID flexibel übergeben werden.

Umsetzung

Um das zu erreichen, wird der im Container verwendete www-data user auf die UID des wirklichen Benutzers umgebogen. Die aktuelle UID wird als Variable an docker compose übergeben.

 

Ich habe in diesem Beispiel alle weiteren Einstellungen für z.B. ssh-key Import, composer caching und Xdebug entfernt, um hier nur das Thema Schreibrechte zu behandeln.

docker-compose.yml (Auszug)

services:
 php-fpm:
   build:
     context: php-fpm
     args:
       USER_ID: "${UID}"
   volumes:
     - ./:/app
   depends_on:
     - database
   working_dir: /app

Dockerfile

FROM php:8.2-fpm
ARG USER_ID=0
ENV USER_ID ${USER_ID}
RUN echo USER_ID=${USER_ID}
RUN mkdir /var/www/.composer && chown $USER_ID:$USER_ID /var/www/.composer
RUN usermod -u $USER_ID www-data
USER $USER_ID

Projekt starten

export UID 
docker compose -f docker-compose.yml -p workspace up
docker compose -f docker-compose.yml -p workspace exec php-fpm

 

Beispiel für ein docker-compose.yml mit einem fpm container, welcher auch als entrypoint verwendet wird um z.B. `composer up` auszuführen.

Article relase date: / Last update: