Поиск по сайту:

Что такое висячие образы 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 позволит избежать пустой траты места на диске и приведет к сокращению списка образов.