Что такое висячие образы Docker?
Висячие образы Docker — это непомеченные и неиспользуемые слои, которые существуют в файловой системе вашего хоста. Вы можете не знать об их присутствии, и обычно это нежелательный мусор.
В этой статье вы узнаете, как возникают висячие изображения и что вы можете сделать, чтобы их убрать. Рекомендуется периодически проверять, сколько у вас висящих изображений, чтобы не тратить место на диске впустую.
Что такое висячее изображение?
Висячее изображение — это просто неиспользуемое изображение, у которого нет имени и тега. Вы можете легко обнаружить висячие изображения при запуске команды docker images
, потому что они отображаются как
.
В этом примере первое изображение в списке — это висячее изображение:
$ docker images <none> <none> 509bc96b727d 2 months ago 55.3MB mysql 5.7 f26e21ddd20d 4 months ago 450MB gcr.io/k8s-minikube/kicbase v0.0.30 1312ccd2422d 6 months ago 1.14GB hello-world latest feb5d9fea6a5 11 months ago 13.3kB
Образ не помечен, но все еще задерживается в вашей системе. В этом случае используется 55,3 МБ дискового пространства.
Вы можете убедиться, что изображение висит, а не просто не используется, проверив, ссылается ли на него какой-либо контейнер:
$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS 2aa683500ee0 gcr.io/k8s-minikube/kicbase:v0.0.30 "/usr/local/bin/entr..." 18 hours ago Exited (130) 18 hours ago
Ни один контейнер не ссылается на изображение
с идентификатором 509bc96b727d
, поэтому оно определенно висит. Обратите внимание, что образы MySQL и Hello World не классифицируются как висячие — несмотря на то, что они не используются контейнерами, они правильно помечены, поэтому предполагается, что вы захотите их сохранить.
Как создаются висячие изображения?
Висячие образы обычно создаются, когда существующий образ заменяется новой сборкой. Вот простой Dockerfile для демонстрации того, что происходит:
FROM alpine:latest COPY demo.txt /demo.txt
Создайте файл с именем demo.txt
в своем рабочем каталоге и добавьте в него содержимое:
$ echo 1 > demo.txt
Теперь создайте образ с помощью docker build
:
$ docker build -t demo:latest .
Запустите команду docker images
, чтобы увидеть новое изображение:
REPOSITORY TAG IMAGE ID CREATED SIZE demo latest 40395b6c1362 24 seconds ago 5.54MB
Теперь измените содержимое demo.txt
и перестройте свой образ:
$ echo 2 > demo.txt $ docker build -t demo:latest .
Используется тот же тег изображения — demo:latest
— поэтому эта сборка заменяет первую. Запустите docker images
, чтобы увидеть эффект:
REPOSITORY TAG IMAGE ID CREATED SIZE demo latest 3d5052e52b4c 3 seconds ago 5.54MB <none> <none> 40395b6c1362 59 seconds ago 5.54MB
Новое изображение было создано с идентификатором 3d5052e52b4c
и тегом demo:latest
. Первое изображение с идентификатором 40395b6c1362
все еще существует, но не было помечено. Теперь он отображается как
. Этот образ стал висящим, так как его не используют никакие контейнеры.
Можете ли вы использовать висячее изображение?
Висячие изображения функционируют так же, как и любые другие изображения. Единственная разница — отсутствие тега. Вы можете запустить контейнер из висячего образа, напрямую сославшись на идентификатор изображения:
$ docker run -it 40395b6c1362 sh / #
Технически образ больше не болтается, потому что теперь он активно используется контейнером. Обычно контейнеры заканчиваются изображением none
, если вы удаляете или перестраиваете тег, который они использовали. Контейнеры с непомеченным образом будут отображать идентификатор образа в столбце IMAGE
при запуске docker ps
вместо обычного тега.
$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26d5609ba75c 40395b6c1362 "sh" 2 seconds ago Up 1 second inspiring_lederberg 91ab866b59a2 portainer/portainer-ce "/portainer" 2 weeks ago Up 2 days 8000/tcp, 9443/tcp portainer_portainer_1
Очистка висящих изображений
Вы можете удалить отдельное висячее изображение с помощью команды docker rmi
, как и любое другое изображение. Поскольку изображение не будет помечено, вам нужно будет идентифицировать его по идентификатору.
$ docker rmi 40395b6c1362
Лучший способ избавиться от множества висящих изображений — команда docker image prune
. Это автоматически удалит все висящие изображения на вашем хосте Docker.
$ docker image prune Total reclaimed space: 5.54 MB
Вывод команды показывает количество освобожденного дискового пространства. Проверьте, действительно ли ваши изображения висят, если ничего не удаляется. Невозможно удалить изображения, активно используемые контейнерами. Вам нужно сначала удалить контейнеры с помощью docker rm
, прежде чем вы попытаетесь обрезать свои образы.
Вы можете обнаружить, что у вас есть оборванное изображение, которое вы действительно хотите повторно использовать в будущем. В этом случае вы можете повторно пометить его с помощью команды docker tag
. Это упростит идентификацию образа и предотвратит его попадание в будущие операции обрезки.
$ docker tag 40395b6c1362 demo:latest
Что насчет промежуточных слоев?
Изображения, которые отображаются как
, могут не быть висячими изображениями. Как ни странно, эта ситуация также возникает для образов, созданных в качестве промежуточных слоев во время сборки.
Каждый шаг в Dockerfile приводит к созданию нового промежуточного слоя. Изображение, созданное в конце сборки, получает указанный вами тег. Другие промежуточные слои остаются непомеченными, и их можно просмотреть, запустив docker images -a
.
Эти слои не являются висячими изображениями, поскольку от них зависят более поздние изображения в цепочке сборки. На них ссылается каждый последующий слой, и они не вызывают проблем с дисковым пространством. Вы можете остановить сохранение промежуточных слоев на диске, включив флаг --rm
во время сборки:
$ docker build --rm -t demo:latest .
Краткое содержание
Висячие образы — это непомеченные образы Docker, которые не используются контейнером и не зависят от потомка. Обычно они не служат никакой цели, но по-прежнему занимают место на диске. Вы будете накапливать висячие изображения, когда замените существующий тег, начав новую сборку.
Все висящие изображения отображаются как
в интерфейсе командной строки Docker. Их слишком много может быть ошеломляющим, когда у вас есть десятки изображений без информации об их истинной личности. Регулярный запуск docker images prune
позволит избежать пустой траты места на диске и приведет к сокращению списка образов.