laravel新项目需先chmod +x artisan并挂载.env,用php:8.2-apache镜像;dockerfile中启用pdo_sqlite、bcmath扩展;db_host填服务名而非localhost;storage/权限问题通过user: “33:33″或统一uid解决。

laravel new 生成的项目怎么直接跑进 Docker?
别先写 docker-compose.yml,更别急着改 php.ini —— Laravel 官方脚手架默认不兼容标准 PHP-FPM 镜像,因为缺 artisan 可执行权限和 .env 加载时机问题。
- 新建项目后立刻执行:
chmod +x artisan,否则容器里运行php artisan serve会报Permission denied -
.env文件必须在容器启动前挂载进去,不能靠docker cp后补;否则APP_KEY为空导致500 internal Server Error - 开发阶段推荐用
php:8.2-apache镜像而非php:8.2-fpm+ nginx 分离,省掉 socket 通信调试——apache2-foreground启动快、日志直出、public/路径默认就对
Dockerfile 里 RUN composer install 为什么总失败?
不是 Composer 版本问题,是 Laravel 10+ 默认要求 ext-pdo_sqlite 和 ext-bcmath,而官方 php:8.2-cli 镜像没开这些扩展。
- 必须显式启用:在
RUN前加docker-php-ext-install pdo_sqlite bcmath - 别用
composer install --no-interaction,Laravel 的post-install-cmd会尝试清空bootstrap/cache/,但该目录在多阶段构建中可能被覆盖成只读,改用composer install --no-scripts,后续再单独跑php artisan config:clear - 缓存 Composer 依赖:把
vendor/单独作为 volume 挂载到宿主机(如./vendor:/var/www/vendor),避免每次docker build都重装
docker-compose.yml 中 DB_HOST 怎么设才不连不上 mysql?
填 127.0.0.1 或 localhost 是最常见错误——Docker 容器内 localhost 指自己,不是宿主机,也不是同 Compose 网络里的其他服务。
- 必须填服务名:比如 MySQL 服务定义为
mysql:,那.env里就得写DB_HOST=mysql - 启动顺序要管:Laravel 容器启动时 MySQL 可能还没 ready,
depends_on只控制启动顺序,不等端口就绪;加个健康检查或用wait-for-it.sh脚本更靠谱 - MySQL 镜像要用
mysql:8.0或mysql:5.7明确版本,别用latest——Laravel 10 不支持 MySQL 8.1+ 的默认认证插件,得加command: --default-authentication-plugin=mysql_native_password
本地开发时 storage/logs/laravel.log 权限总是 600 怎么办?
容器里 PHP 进程 UID 默认是 www-data (33),但宿主机挂载的 storage/ 目录属主是当前用户(比如 UID 1001),导致日志写不进、缓存生成失败、500 错误无提示。
- 不要在 Dockerfile 里
chown -R www-data:www-data storage/—— 挂载后权限会被覆盖;改用user: "33:33"在docker-compose.yml中指定运行 UID/GID - 或者统一 UID:在宿主机创建用户
useradd -u 33 -g 33 laravel,再把storage/归属改成它,一劳永逸 - 临时调试可加
php artisan storage:link到public/storage,但注意这个命令也受 UID 限制,得在容器内以www-data身份运行
真正卡住人的从来不是 Dockerfile 写几行,而是 storage/ 和 bootstrap/cache/ 这两个目录的 UID 同步、.env 加载时机、以及 MySQL 服务名写错这三件事。其它都是表象。