完全重置 Docker Compose 中的单个服务,包括删除卷?

Completely reset a single service in Docker Compose, including deleting the volumes?

我想重新创建一个服务,包括它的卷。我得到的最接近的是以下命令:

docker-compose stop foo
docker-compose rm -f foo
docker-compose up --renew-anon-volumes -d foo
docker-compose start foo

这里的问题是 --renew-anon-volumes 重新创建所有具有匿名卷的服务,而不仅仅是 foo 的卷。如果我不使用 --renew-anon-volumes,那么我想我需要一个命名卷来做 docker volume rm myvolume。但是,对于命名卷,Docker Compose 总是在项目名称前加上。由于我的脚本不知道项目名称,因此我无法以编程方式删除该卷。我不能强制用户使用特定的项目名称。我知道我可以使用环境变量设置项目名称,但不能保证用户不会 运行 Docker Compose 使用不同的项目名称。

我认为有两种可能的解决方案:

  1. 使--renew-anon-volumes只为我指定的服务重新创建卷

  2. 使用命名卷并以某种方式找出正确的前缀

这些是否可行,或者是否有其他解决方案?

条条大路通罗马,具体取决于您的先决条件:

  1. 执行 docker volume ls 并对您命名的卷的结果进行正则表达式(如果卷名称是唯一的,就可以工作)
  2. 在 运行 docker-compose up 之前使用 external 卷和 volume create 具有已知名称的 bootstrap 脚本(如果必须实例化卷则不起作用)
  3. 将项目名称设置为已知值。通常它采用文件夹名称,但可以在 docker-compose 命令 (-p NAME) 或环境变量 (COMPOSE_PROJECT_NAME=NAME) 中明确给出。
  4. 设置一个虚拟 compose-file 仅包含此单个服务及其脚本卷。执行 docker-compose -f 'your-down-file.yml' down -v 删除属于此服务的所有命名和匿名卷以及此文件上的 docker-compose -f .. up

编辑 (@DavidMaze):

你说得对,docker compose 承认这一事实。但它不会删除它,只是警告。如果你想删除所有“孤儿”,你需要标志 --remove-orphans。 但是由于某些原因,即使给出标志 -v,down 也不会删除卷。这可能会被报告,因为它的行为与描述的不同。

和勘误表:标志 -f 必须在 up/down 之前而不是之后!

docker-compose rm 有一个 -v 选项可以删除附加到容器的匿名卷,还有一个 -s 选项可以停止容器。对于您的特定用例,它应该足以:

docker-compose rm -s -f -v foo
docker-compose up -d foo

这仅对匿名卷有帮助,也就是说,Compose 文件 volumes: 只有一个容器路径并且没有相应的 top-level volumes: 条目。我没有立即看到用于列出、删除或以其他方式管理 Compose 创建的命名卷的 Compose 选项。