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

Docker Compose重建启动容器时如何避免卷内文件丢失?

解决Vapor应用Docker Compose重建后上传文件丢失的问题

问题根源

你当前的Web应用中,用户上传的图片存在容器内的itemPicture/目录,但这个目录没有挂载持久化卷——容器的可写层会随容器销毁而消失,所以重建容器后文件就没了。而数据库通过db_data命名卷做了持久化,因此数据不受影响。

解决方案

通过新增命名卷挂载itemPicture/目录,让上传文件存储在宿主机的Docker卷中,而非容器层:

  1. 添加上传文件专用卷:在volumes区块新增app_uploads卷
  2. 挂载卷到app服务:在app服务的配置中添加volumes字段,将app_uploads卷映射到容器内的itemPicture/目录(需确认容器内的实际路径,比如你的Vapor应用中该目录路径为/app/itemPicture)

修改后的完整docker-compose.yml如下:

version: '3.7'

volumes:
  db_data:
  app_uploads: # 新增:存储上传文件的卷

x-shared_environment: &shared_environment
  LOG_LEVEL: ${LOG_LEVEL:-debug}
  DATABASE_HOST: db
  DATABASE_NAME: vapor_database
  DATABASE_USERNAME: vapor_username
  DATABASE_PASSWORD: vapor_password

services:
  app:
    image: leportantvaporapp:latest
    build:
      context: .
    environment:
      <<: *shared_environment
    depends_on:
      - db
    ports:
      - '8080:8080'
    # 新增:挂载上传文件卷到容器内的itemPicture目录
    volumes:
      - app_uploads:/app/itemPicture # 替换为你容器内实际的itemPicture路径
#    user: '0' # uncomment to run as root for testing purposes even though Dockerfile defines 'vapor' user.
    command: ["serve", "--env", "production", "--hostname", "0.0.0.0", "--port", "8080"]
  migrate:
    image: leportantvaporapp:latest
    build:
      context: .
    environment:
      <<: *shared_environment
    depends_on:
      - db
    command: ["migrate", "--yes"]
    deploy:
      replicas: 0
  revert:
    image: leportantvaporapp:latest
    build:
      context: .
    environment:
      <<: *shared_environment
    depends_on:
      - db
    command: ["migrate", "--revert", "--yes"]
    deploy:
      replicas: 0
  db:
    image: postgres:12-alpine
    volumes:
      - db_data:/var/lib/postgresql/data/pgdata
    environment:
      PGDATA: /var/lib/postgresql/data/pgdata
      POSTGRES_USER: vapor_username
      POSTGRES_PASSWORD: vapor_password
      POSTGRES_DB: vapor_database
    ports:
      - '5432:5432'

注意事项

  • 权限检查:确保容器内itemPicture目录的读写权限属于Vapor运行用户(默认是vapor)。可在Dockerfile中添加以下命令提前创建目录并设置权限:
    RUN mkdir -p /app/itemPicture && chown vapor:vapor /app/itemPicture
    
    若临时测试,可开启user: '0'以root身份运行容器。
  • 更新代码后的操作:拉取GitHub代码后,若仅需更新应用代码无需重建镜像,直接执行docker-compose up -d即可;若需重建镜像,执行docker-compose up --build,挂载的卷会保留所有上传文件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:23:11