Laravel Docker环境下Composer install无法创建vendor文件夹问题求助
问题原因
- 挂载覆盖问题:你在nginx和php的Dockerfile构建阶段创建的
/var/www/html目录,会被容器启动时挂载的宿主机./src目录完全覆盖,构建阶段生成的目录不会同步到Droplet宿主机。如果宿主机的./src目录不存在,Docker会自动以root身份创建该目录,默认权限为root所有,容器内的非root用户没有写入权限。 - Composer运行用户不匹配:原项目的composer服务默认未指定运行用户,执行
docker-compose run --rm composer install时会默认以root身份运行,生成的vendor目录及文件权限为root所有,php/nginx服务运行的www-data用户无读写权限,触发目录创建失败报错。
解决方案
- 统一用户UID/GID配置
在项目根目录的.env文件中添加以下配置,将容器内运行用户的UID/GID和你在Droplet上操作项目的用户保持一致(如果是用root用户操作,填0即可;如果是普通用户,默认UID为1000,可通过id命令查询当前用户UID):
NGINXUSER=1000 NGINXGROUP=1000 PHPUSER=1000 PHPGROUP=1000
- 修改composer服务运行用户
打开docker-compose.yml,找到composer服务配置块,添加user参数,和php服务用户保持一致:
composer: build: context: . dockerfile: composer.dockerfile args: - PHPUSER=${PHPUSER:-www-data} - PHPGROUP=${PHPGROUP:-www-data} volumes: - ./src:/var/www/html user: "${PHPUSER:-www-data}" # 新增这一行 networks: - laravel
- 重置目录权限与容器
在Droplet项目根目录依次执行以下命令:
# 停止所有容器并清理关联卷 docker-compose down -v # 手动创建src目录并修改权限(替换1000为你实际使用的用户UID/GID) mkdir -p src sudo chown -R 1000:1000 src # 重新构建启动所有容器 docker-compose up -d --build # 执行composer安装 docker-compose run --rm composer install
验证方法
执行以下命令查看目录权限是否正常:
docker-compose run --rm php ls -la /var/www/html
返回结果中目录所有者应和你设置的PHPUSER一致,而非root,此时站点即可正常读写目录。
内容的提问来源于stack exchange,提问作者MERLIN F1
相关产品推荐
相关产品推荐

