dockerのphpコンテナ内で新規作成したファイルの権限エラー

初めての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 
```



```docker-compose.yml
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
```

作成されたcotrollerを編集しようとすると、、、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3122509/fa66e156-6947-3a37-5c16-02e3bf28d0af.png)

編集できません。
<br>

解決方法
---------------------
rootでコンテナに入るので権限の問題が発生します。権限問題を解決するために3つ提案します。

**1\. chmodコマンドですべてのユーザーに読み込み書き込み実行権限を与える**

phpコンテナの外から以下のコマンドを入力
```
$ sudo chmod -R 777 src/*
```
[chmodコマンドについて](https://qiita.com/yukachin0414/items/ff30ab54bb147517e276)

しかしこの方法では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に追記する**
```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」コマンド（設定値編）](https://qiita.com/yukachin0414/items/ff30ab54bb147517e276)
・[Dockerでrootとuserを切り替えてコンテナに入る](https://qiita.com/Nahuel/items/d11d169ba7c40b413e6b#1-docker%E3%82%B3%E3%83%B3%E3%83%86%E3%83%8A%E3%82%92%E8%B5%B7%E5%8B%95%E3%81%97user%E3%81%A7%E5%85%A5%E3%82%8B)
・[Docker開発環境(1): ownerがrootになるのを回避する](https://zenn.dev/anyakichi/articles/0fb5865cc5e1e3)