You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Laravel Sail构建的Docker镜像推送至Docker Hub后拉取为空如何解决

问题原因

你当前构建的镜像本身未包含Laravel项目代码,本地可正常运行完全依赖docker-compose的本地目录挂载配置:

  • Sail默认生成的Dockerfile仅封装PHP、Nginx等运行时依赖,不会主动打包你的项目代码
  • 本地执行docker-compose up时,配置里的volumes: '.:/var/www/html'会把本地项目根目录的所有文件挂载到容器内对应路径,所以容器可以正常读取代码运行
  • 单独执行docker-compose build生成的镜像仅包含运行时环境,无任何项目代码,推送到Docker Hub后拉取自然会出现代码缺失的问题

修复方案

如果需要生成可分发、包含完整项目代码的镜像,按以下步骤调整配置即可:

  1. 把Sail默认生成的./vendor/laravel/sail/runtimes/8.0/Dockerfile复制到你的项目根目录,建议存为docker/Dockerfile方便管理
  2. 在复制后的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
  1. 修改docker-compose.yml中的build配置,将构建上下文改为项目根目录:
build:
    context: .
    dockerfile: docker/Dockerfile
    args:
        WWWGROUP: '${WWWGROUP}'
  1. 原有volumes配置不需要修改,本地开发时挂载的本地目录会覆盖镜像内的/var/www/html路径,不影响代码热更新的开发体验
  2. 重新执行docker-compose build构建镜像,此时生成的镜像就包含完整的项目代码,推送到Docker Hub后其他人拉取即可正常运行

额外建议

  • 可以在Dockerfile的COPY步骤后添加composer install --no-dev --optimize-autoloader命令自动安装生产依赖,不需要把本地的vendor目录打包进镜像
  • 敏感配置(如数据库密码、APP_KEY等)不要打包到镜像内,继续通过环境变量传入即可

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:24:09