Удалить все контейнеры Docker, кроме одного

У меня есть скрипт, который останавливает контейнеры, а затем удаляет их

docker stop $(docker ps -q)
docker rm $(docker ps -a -q)

Но я не хочу удалять контейнер док-станции с именем "my_docker".

Как я могу удалить все контейнеры, кроме этого?

Ответ 1

Вы можете попробовать это, что будет

  • Отфильтруйте нежелательный элемент (grep -v), а затем
  • возвращает первый столбец, который содержит идентификатор контейнера

Запустите эту команду:

docker rm $(docker ps -a | grep -v "my_docker" | awk 'NR>1 {print $1}')

Чтобы использовать cut вместо awk, попробуйте следующее:

docker rm $(docker ps -a | grep -v "my_docker" | cut -d ' ' -f1)

Примеры использования awk/cut здесь: bash: кратчайший способ получить n-й столбец вывода

Ответ 2

Название вопроса задает изображения, а не контейнеры. Для тех, кто наткнулся на этот вопрос, глядя на удалить все изображения, кроме одного, вы можете использовать docker prune вместе с флажками фильтра:

docker image prune -a --force --filter "label!=image_name"

заменив имя_файла именем вашего изображения.

Вы также можете использовать флаг "до =", чтобы обрезать изображения по дате.

Ответ 3

Это то, что на самом деле происходит docker rm $(List of container Ids). Так что это просто вопрос о том, как вы можете отфильтровать список идентификаторов контейнера.

Например: Если вы хотите удалить весь контейнер, но один с конкретным идентификатором контейнера, то этот docker rm $(docker ps -a -q | grep -v "my_container_id") выполнит трюк.

Ответ 4

Я бы предпочел проверить имя контейнера, используя что-то вдоль строк (untested)

docker inspect --format '{{ .Name }}' $(docker ps -aq)

это даст имена контейнеров (работающих или нет), и вы можете фильтровать и

docker rm

используя эту информацию

Ответ 5

Старый вопрос, но мне нравится оживлять сообщения.

В таком случае вы можете использовать Spotify Docker GC: https://github.com/spotify/docker-gc#excluding-containers-from-garbage-collection

Вы можете сделать:

echo "my_docker" >> /tmp/docker-gc-exclude-containers
echo '*' > /tmp/docker-gc-exclude
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc:ro -v /tmp/docker-gc-exclude-containers:/etc/docker-gc-exclude-containers:ro -v /tmp/docker-gc-exclude:/etc/docker-gc-exclude:ro spotify/docker-gc

(если вы хотите, чтобы ваши изображения были очищены тоже, вы можете избежать установки файла docker-gc-exclude)

Ответ 6

Чтобы остановить

docker stop $(docker ps -a -q | grep -v "my_container_id")

Удалить

docker rm $(docker ps -a -q | grep -v "my_container_id")

Ответ 7

Я достиг этого с помощью следующей команды:

docker image rm -f $(docker images -a | grep -v "image_repository_name" | awk 'NR>1 {print $1}')