在Docker的PHP容器中,对于新创建的文件,出现了权限错误

这是我第一次在Qiita上发布的文章。希望能够尽我的一份力帮助大家。

目标

docker環境でのlaravelの学習中で権限エラーでお困りの方

首先

在docker的php容器中,尝试用vscode编辑通过artisan命令创建的文件时,出现了”没有权限无法保存”的错误,并且无法保存的问题发生了。

环境

laravel 8.x
windows11
docker
wsl2

Dockerfile (Docker文件)

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

创建一个控制器

$ root@9b6dd4f9ed6e:/var/www# php artisan make:controller TestController
image.png

无法编辑。

解决方案

进入Root容器会引发权限问题。为解决权限问题,提出以下三个建议。

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

从php容器的外部输入以下命令。

$ sudo chmod -R 777 src/*

有关chmod命令

不过这种方法需要每次使用artisan命令创建时都要通过chmod改变权限。

2. 以 “user” 用户身份进入 php 容器内。

$ 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的用户名登录到容器中,并创建没有权限错误的文件。

将以下内容添加到docker-compose.yml文件中。

##phpコンテナの部分のみ抽出

  php:
    build: ./docker/php
    user: "1000:1000"  ←追記
    volumes:
      - ./src:/var/www/

修改内容后重新构建

$ 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和用户进入容器。
・避免Docker开发环境(1)中所有者为root。

bannerAds