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

Docker重构Laravel应用时如何保留存储文件并更新代码

Laravel Docker容器无法加载最新代码的解决方案

问题背景

部署Laravel应用的Docker容器后,出现以下问题:

  • 重启容器后仍运行旧代码
  • 重新构建镜像并执行docker compose down && docker compose up -d,代码未更新
  • 仅执行docker compose down --volume彻底移除容器后启动能加载新代码,但会丢失存储目录中的图片

问题根源

你的原始配置中,shared-data命名卷挂载到了容器的/var/www/html目录,而Dockerfile已将代码COPY到该目录。Docker卷(包括命名卷和绑定挂载)的优先级高于容器镜像内的文件,因此即使重新构建镜像,卷内的旧代码会覆盖镜像中的新代码,导致无法看到更新。

解决方案

1. 开发环境(实时同步代码)

你编辑后的docker-compose.yml使用了绑定挂载./app:/var/www,适合开发场景:

  • 确保本地./app目录为最新代码
  • 若仅修改业务代码,无需重新构建镜像,直接重启PHP-FPM容器即可:
    docker compose restart backend_php
    
  • 若修改了Nginx配置,同时重启Nginx容器:
    docker compose restart backend_nginx
    
  • 若修改了Dockerfile(如安装新扩展、依赖),需重新构建并启动:
    docker compose up -d --build backend_php
    

2. 生产/正式环境(镜像内置代码)

生产环境应让镜像包含完整应用代码,仅挂载需要持久化的目录(如storage),避免卷覆盖应用根目录:

步骤1:调整docker-compose.yml

移除对应用根目录的卷挂载,仅挂载storage目录:

version: '3'
services:
  php-fpm:
    image: laravel_image:1.0.0
    volumes:
      # 仅挂载需要持久化的storage目录
      - laravel-storage:/var/www/html/storage
    environment:
      - APP_ENV=production
      - ...
  nginx:
    image: nginx:latest
    ports:
      - "8080:443"
    volumes:
      - laravel-storage:/var/www/html/storage
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
    depends_on:
      - php-fpm
  
volumes:
  laravel-storage:

步骤2:更新代码并构建新镜像

给新镜像打上唯一标签(如版本号、Git提交哈希):

docker build -t laravel_image:1.0.1 .

步骤3:更新容器

修改docker-compose.yml中的镜像标签为1.0.1,然后重启:

docker compose down && docker compose up -d

或直接强制构建并启动:

docker compose up -d --build php-fpm

3. 核心注意事项

  • 永远不要挂载整个应用根目录,仅单独挂载需要持久化的目录(如storage、public/uploads),这样更新代码时不会丢失存储的图片等文件。
  • 生产环境建议使用带版本号的镜像标签,避免latest标签的缓存问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 22:33:19