在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

无法编辑。
解决方案
进入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。