初めてのqiita投稿です。少しでも皆さまのお力になれればと思います。
対象
docker環境でのlaravelの学習中で権限エラーでお困りの方
はじめに
dockerのphpコンテナ内で、artisanコマンドにより作成したファイルをvscodeで編集しようとすると、
「権限がないため保存できません」とエラーが出てしまい、保存されない現象が起こりました。
環境
laravel 8.x
windows11
docker
wsl2
Dockerfile
FROM php:7.4.9-fpm
COPY php.ini /usr/local/etc/php/
RUN apt update \
&& apt install -y default-mysql-client zlib1g-dev libzip-dev unzip \
&& docker-php-ext-install pdo_mysql zip
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer \
&& composer self-update
WORKDIR /var/www
version: '3.8'
services:
nginx:
image: nginx:1.21.1
ports:
- "80:80"
volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
- ./src:/var/www/
depends_on:
- php
php:
build: ./docker/php
volumes:
- ./src:/var/www/
mysql:
image: mysql:8.0.26
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel_db
MYSQL_USER: laravel_user
MYSQL_PASSWORD: laravel_pass
command:
mysqld --default-authentication-plugin=mysql_native_password
volumes:
- ./docker/mysql/data:/var/lib/mysql
- ./docker/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
phpmyadmin:
image: phpmyadmin/phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=laravel_user
- PMA_PASSWORD=laravel_pass
depends_on:
- mysql
ports:
- 8080:80
エラー詳細
以下のコマンドでコンテナに入る
$ docker-compose exec php bash
controllerを作成する
$ root@9b6dd4f9ed6e:/var/www# php artisan make:controller TestController
編集できません。
解決方法
rootでコンテナに入るので権限の問題が発生します。権限問題を解決するために3つ提案します。
1. chmodコマンドですべてのユーザーに読み込み書き込み実行権限を与える
phpコンテナの外から以下のコマンドを入力
$ sudo chmod -R 777 src/*
しかしこの方法ではartisanコマンドで作成するたびにchmodで権限を変更する必要があります。
2. phpコンテナにuserで入る
$ docker run -it -v /etc/group:/etc/group:ro -v /etc/passwd:/etc/passwd:ro -u $(id -u $USER):$(id -g $USER) php bash
これでubuntuのユーザー名でコンテナに入り、権限エラーが起きないファイルが作成できます。
3. docker-compose.ymlに追記する
##phpコンテナの部分のみ抽出
php:
build: ./docker/php
user: "1000:1000" ←追記
volumes:
- ./src:/var/www/
追記後はbuildし直す
$ docker-compose up -d --build
phpコンテナに入りなおす
$ docker-compose exec php bash
すると、、、
I have no name!@bb5a23512433:/var/www$
ユーザーでコンテナに入れました!
ユーザー名がi have no name!になるのを解決
Dockerfileに以下のように追記
FROM php:7.4.9-fpm
COPY php.ini /usr/local/etc/php/
RUN apt update \
&& apt install -y default-mysql-client zlib1g-dev libzip-dev unzip \
&& docker-php-ext-install pdo_mysql zip
RUN curl -sS https://getcomposer.org/installer | php \
&& mv composer.phar /usr/local/bin/composer \
&& composer self-update
RUN useradd -m 任意のユーザー名 ←追記
WORKDIR /var/www
以上です。
参考
・(ファイルやフォルダのパーミッションやアクセス権限を設定する「chmod」コマンド(設定値編)
・Dockerでrootとuserを切り替えてコンテナに入る
・Docker開発環境(1): ownerがrootになるのを回避する