完全重置 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 使用不同的项目名称。
我认为有两种可能的解决方案:
使--renew-anon-volumes
只为我指定的服务重新创建卷
使用命名卷并以某种方式找出正确的前缀
这些是否可行,或者是否有其他解决方案?
条条大路通罗马,具体取决于您的先决条件:
- 执行
docker volume ls
并对您命名的卷的结果进行正则表达式(如果卷名称是唯一的,就可以工作)
- 在 运行
docker-compose up
之前使用 external
卷和 volume create
具有已知名称的 bootstrap 脚本(如果必须实例化卷则不起作用)
- 将项目名称设置为已知值。通常它采用文件夹名称,但可以在
docker-compose
命令 (-p NAME
) 或环境变量 (COMPOSE_PROJECT_NAME=NAME
) 中明确给出。
- 设置一个虚拟 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 选项。
我想重新创建一个服务,包括它的卷。我得到的最接近的是以下命令:
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 使用不同的项目名称。
我认为有两种可能的解决方案:
使
--renew-anon-volumes
只为我指定的服务重新创建卷使用命名卷并以某种方式找出正确的前缀
这些是否可行,或者是否有其他解决方案?
条条大路通罗马,具体取决于您的先决条件:
- 执行
docker volume ls
并对您命名的卷的结果进行正则表达式(如果卷名称是唯一的,就可以工作) - 在 运行
docker-compose up
之前使用external
卷和volume create
具有已知名称的 bootstrap 脚本(如果必须实例化卷则不起作用) - 将项目名称设置为已知值。通常它采用文件夹名称,但可以在
docker-compose
命令 (-p NAME
) 或环境变量 (COMPOSE_PROJECT_NAME=NAME
) 中明确给出。 - 设置一个虚拟 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 选项。