Каждое изображение Docker имеет уникальный шестнадцатеричный идентификатор.Эти идентификаторы будут разными в разных системах (даже docker pull
одного и того же изображения), но каждое изображение имеет ровно один идентификатор.
Каждое изображение имеет определенное количество тегов, связанных с ним.Это может быть ни один, или несколько.docker tag
добавит тег к существующему изображению;docker rmi
удалит тег, а также (если на изображении нет других тегов, нет других изображений, использующих изображение в качестве основы, и нет существующих контейнеров, использующих изображение), удалите изображение.
Этоможно «украсть» тег из существующего изображения.Наиболее очевидный способ сделать это с помощью docker build
:
cat >Dockerfile <<EOF
FROM busybox
COPY file.txt /
EOF
echo foo > file.txt
docker build -t foo .
docker images
# note the ID for foo:latest
echo bar > file.txt
docker build -t foo .
docker images
# note the old ID will show as foo:<none>
# note a different ID for foo:latest
Явный docker tag
может сделать это тоже.Изображения в Docker Hub и других репозиториях также могут изменяться (ubuntu:16.04
регулярно переиздается с обновлениями безопасности), и поэтому, если вы docker pull
уже имеете изображение, оно может привести к тому, что старое изображение «потеряет свое имя» в пользуболее новой версии этого изображения.
Как это взаимодействует с docker run
и docker ps
?docker run
может запомнить тег изображения, с которого было начато изображение, но если изображение больше не имеет этого тега, оно забывает эту информацию.Вот почему ваш вывод docker ps
возвращается к отображению шестнадцатеричного идентификатора изображения.
Существует несколько способов обойти это для вашего приложения:
Если изображениеэто тот, который вы создаете сами, всегда используйте явный тег версии (может быть просто текущая метка даты) как при создании, так и при запуске изображения.Тогда вы никогда не будете перезаписывать тег существующего изображения.(«Не используйте :latest
теги.»)
Используйте docker run --name
, чтобы отслеживать, какой контейнер есть, и фильтруйте на основе этого, а не тег изображения.(Предложение @ quentino из комментариев.)
Не указывайте явно docker pull
в вашем рабочем процессе.Если у вас нет изображения, docker run
автоматически вытянет его для вас.Это позволит избежать незначительных обновлений существующих изображений, а также избежать потери имен существующих изображений.