Имя образа докера изменяется автоматически - PullRequest
0 голосов
/ 02 декабря 2018

Я запустил несколько контейнеров на своем хосте (Ubuntu Server)

Я запустил Docker-контейнер с помощью команды, как показано ниже

sudo docker run -d -p 5050:80 gitname/reponame

И после того, как я позвонил sudo docker ps и этопоказывает

CONTAINER ID: e404ffa2bc6b 
IMAGE: gitname/reponame 
COMMAND: "dotnet run --server…"
CREATED: 14 seconds ago
STATUS: Up 12 seconds
PORTS: 5050/tcp, 0.0.0.0:5050->80/tcp
NAMES: reverent_mcnulty

И через неделю я снова запускаю sudo docker ps, и он показывает другую информацию, где ИЗОБРАЖЕНИЕ было изменено, и выглядит как ba2486f19dc0

Я не понимаю, почему.

Это проблема для меня, потому что для остановки контейнеров я использую команду:

sudo docker stop $(sudo docker ps | awk '{ print $1,$2 }' | grep gitname/reponame |  awk '{print $1 }')

И она не работает, потому что имя изображения уже было изменено

1 Ответ

0 голосов
/ 02 декабря 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...