5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Last updated at Posted at 2023-11-20

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

編集できません。

解決方法

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

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

phpコンテナの外から以下のコマンドを入力

$ sudo chmod -R 777 src/*

chmodコマンドについて

しかしこの方法では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」コマンド(設定値編)
Dockerでrootとuserを切り替えてコンテナに入る
Docker開発環境(1): ownerがrootになるのを回避する

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?