LaradockではなくLaravelをDockerでローカル開発している際にPermission Deniedで/storage/logs
の書き込みが失敗する事象が見られた。
この際の回避方法を残しておきます。
おそらくPermission Deniedになる原因はホストとクライアントとでUID、GIDが異なることで発生する。
docker-composeにより構成はNginx > php-fpmとしている場合以下のようにphp-fpm側のDockerfileにNginxのユーザーであるwww-data
に対して任意のUID、GIDが指定できるようにしておく。
Dockerfile
ARG PUID=1000
ARG PGID=1000
RUN echo "-> $PUID"
RUN echo "-> $PGID"
RUN groupmod -o -g $PGID www-data && \
usermod -o -u $PUID -g www-data www-data
これをdocker-compose build
時に自身のMacのUID、GIDをを差し込む。
$ docker-compose build --build-arg PUID=$(id -u) --build-arg PGID=$(id -g) app
これで無事ホストとクライアントのUID、GIDが同じになった。
おまけ
Makefileで上記のコマンドを設定していると$(id -u)
が正しく解決できなかった。
以下のように書くとうまくいく
Makefile
build_app:
$(eval UID := $(shell id -u))
$(eval GID := $(shell id -g))
@docker-compose build --build-arg PUID=$(UID) --build-arg PGID=$(GID) app