Docker Compose重建启动容器时如何避免卷内文件丢失?
解决Vapor应用Docker Compose重建后上传文件丢失的问题
问题根源
你当前的Web应用中,用户上传的图片存在容器内的itemPicture/目录,但这个目录没有挂载持久化卷——容器的可写层会随容器销毁而消失,所以重建容器后文件就没了。而数据库通过db_data命名卷做了持久化,因此数据不受影响。
解决方案
通过新增命名卷挂载itemPicture/目录,让上传文件存储在宿主机的Docker卷中,而非容器层:
- 添加上传文件专用卷:在
volumes区块新增app_uploads卷 - 挂载卷到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/itemPictureuser: '0'以root身份运行容器。 - 更新代码后的操作:拉取GitHub代码后,若仅需更新应用代码无需重建镜像,直接执行
docker-compose up -d即可;若需重建镜像,执行docker-compose up --build,挂载的卷会保留所有上传文件。
内容的提问来源于stack exchange,提问作者Emmanuel Leicher
相关产品推荐
相关产品推荐

