Docker Compose 5.7.0(2026-11-02)改了 down -v:卷上没有本项目的 com.docker.compose.project 标签时,不再删掉,只打一行 Skipped。
5.6.1 同场景会真删。官方 PR #14374 说,这和 up 已经遵守的 ownedConfigHash 规则对齐,外来卷或别的项目的卷都应跳过。下面用官方二进制 5.6.1 对照 5.7.0,再用 Spring Boot 4.1.2 的 JDBC 看 MySQL 里那一行还在不在。
5.6.1:外来卷会被 down -v 删掉
先 docker volume create 建一个没有 Compose 标签的卷,写进 FOREIGN-MARKER,再让 compose 文件用同名卷挂到服务上。up 时两边都会警告「already exists but was not created by Docker Compose」,但 5.6.1 的 down -v 照样 Removing:
===== alpine 5.6.1 =====
V561_ALPINE_VOLUME=REMOVED
MySQL 场景更伤:卷事先建好,Compose 挂到 /var/lib/mysql。Boot 4.1.2 插入 probe_marker 一行 KEEP-ME 后,down -v 把卷删了;再 up 等于全新初始化,表都没了:
===== mysql 5.6.1 =====
SEED_COUNT=1
V561_VOLUME=REMOVED
ROW_COUNT=MISSING
ERR=BadSqlGrammarException: ... probe_marker ...
5.7.0:Skipped,标记还在
同一套 compose,换 5.7.0:
===== alpine 5.7.0 =====
Volume c570_foreign_data Skipped Volume was not created by Docker Compose
V570_ALPINE_VOLUME=KEPT
V570_ALPINE_MARKER=FOREIGN-MARKER
MySQL 同样:seed 之后 down -v 只 Skipped,再 up,Boot 还能数到那一行:
===== mysql 5.7.0 + Boot 4.1.2 =====
BOOT=4.1.2
SEED_COUNT=1
V570_VOLUME=KEPT
ROW_COUNT=1
本项目自己创建、带项目标签的卷,down -v 仍会删,行为没变。要真正共用外来卷,YAML 里仍应写 external: true;5.7.0 只是把「忘了标 external、却指望数据活着」的坑填上了。共享盘、CI 里预置的命名卷、别的 compose 项目贴过来的卷,升到 5.7.0 后再 down -v 不会被误伤。
一起交流
分享你的思考,让讨论更进一步。