Когда вы выполните docker-compose up
, он будет основан на docker-compose.yml
файл.
Обычно это вызывает сеть, создает и запускает несколько служб. Если вы сделаете это с флагом -d
, клиент docker-compose
отключится и оставит серверы в покое.
Если вы выполните docker-compose down
, он закрывает запущенные контейнеры и дополнительно удаляет соответствующие сети.
Но ... что, если после up
файл .yml
пропал?
Нужно ли вручную выполнять завершение работы с помощью docker stop
, вручную определяя службы этого проекта, и docker rm
и docker network rm
и так далее?
Или docker-compose
достаточно умен, чтобы пометить все объекты (контейнеры, сети и т. Д.) Тегом, чтобы вы могли сказать ему что-то вроде docker -компоновать имя-проекта
так, чтобы он не просматривал файл .yml
(который теперь не находится в файловой системе), а проверял запущенные экземпляры и сети?
AFAIK вы не можете просто использовать docker-compose down
без соответствующего docker-compose.yml
.
Однако, ваша идея с меткой тоже не так уж далека от реальности: При вызове docker-compose up
, docker-compose
префиксом все, что он создает по имени каталога композиционного файла. Это позволяет идентифицировать наборы контейнеров, которые принадлежат друг другу даже без соответствующего файла docker-compos.yml
. Я часто в конце концов записываю вариации этого в мою интерактивную оболочку:
docker rm $(docker ps -a | grep ... | cut -c -16)
Конечно, если бы писать сценарий так "правильно", то можно было бы использовать возможность Docker'а по форматированию и поиску выходных данных и полагаться на имена или ID'ы, а не только на первые 16 символов из ID'ов. Кроме того, эта операция является idempotent, потому что она не работает, если нет совпадений для grep
.
После этого следуйте по docker network rm ...
и docker volume rm ...
, чтобы очистить оставшуюся часть.