使用Laravel Sail构建的Docker镜像推送至Docker Hub后拉取为空如何解决
问题原因
你当前构建的镜像本身未包含Laravel项目代码,本地可正常运行完全依赖docker-compose的本地目录挂载配置:
- Sail默认生成的Dockerfile仅封装PHP、Nginx等运行时依赖,不会主动打包你的项目代码
- 本地执行
docker-compose up时,配置里的volumes: '.:/var/www/html'会把本地项目根目录的所有文件挂载到容器内对应路径,所以容器可以正常读取代码运行 - 单独执行
docker-compose build生成的镜像仅包含运行时环境,无任何项目代码,推送到Docker Hub后拉取自然会出现代码缺失的问题
修复方案
如果需要生成可分发、包含完整项目代码的镜像,按以下步骤调整配置即可:
- 把Sail默认生成的
./vendor/laravel/sail/runtimes/8.0/Dockerfile复制到你的项目根目录,建议存为docker/Dockerfile方便管理 - 在复制后的Dockerfile末尾添加代码复制和权限配置逻辑:
# 原有Sail Dockerfile的所有内容保留,在最后追加以下内容 COPY . /var/www/html RUN chown -R www-data:www-data /var/www/html \ && chmod -R 755 /var/www/html/storage \ && chmod -R 755 /var/www/html/bootstrap/cache
- 修改
docker-compose.yml中的build配置,将构建上下文改为项目根目录:
build: context: . dockerfile: docker/Dockerfile args: WWWGROUP: '${WWWGROUP}'
- 原有
volumes配置不需要修改,本地开发时挂载的本地目录会覆盖镜像内的/var/www/html路径,不影响代码热更新的开发体验 - 重新执行
docker-compose build构建镜像,此时生成的镜像就包含完整的项目代码,推送到Docker Hub后其他人拉取即可正常运行
额外建议
- 可以在Dockerfile的COPY步骤后添加
composer install --no-dev --optimize-autoloader命令自动安装生产依赖,不需要把本地的vendor目录打包进镜像 - 敏感配置(如数据库密码、APP_KEY等)不要打包到镜像内,继续通过环境变量传入即可
内容的提问来源于stack exchange,提问作者Roman
相关产品推荐
相关产品推荐

