Скажем, у меня есть тривиальный контейнер на основе ubuntu:latest
. Теперь есть обновление безопасности и ubuntu:latest
оно обновляется в репозитории Docker.
Откуда мне знать, что мой локальный образ и его контейнеры работают позади?
Есть ли некоторые рекомендации по автоматическому обновлению локальных образов и контейнеров в соответствии с обновлениями хранилища Docker, которые на практике дадут вам те же тонкости, что и автоматические обновления, запущенные на обычной машине с Ubuntu?
docker
automatic-updates
hbogert
источник
источник
Ответы:
Один из способов сделать это - провести через систему CI / CD. Как только ваше родительское изображение будет создано, сделайте что-то, что сканирует ваши git-репозитории на изображения с использованием этого родителя. Если он найден, вы бы отправили запрос на удаление новых версий изображения. Запрос на включение, если все тесты пройдены, будет объединен, и у вас будет новое дочернее изображение на основе обновленного родительского. Пример инструмента, который использует этот подход, можно найти здесь: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 .
Если вы не управляете своим родительским изображением, как в случае, если вы зависите от официального
ubuntu
изображения, вы можете написать некоторые инструменты, которые обнаруживают изменения в теге родительского изображения или контрольной сумме (не то же самое, теги являются изменяемыми) и вызвать детей образы строит соответственно.источник
Мы используем скрипт, который проверяет, запущен ли запущенный контейнер с самым последним образом. Мы также используем сценарии инициализации upstart для запуска образа докера.
И init выглядит так
источник
redis
),LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
получит информацию о контейнере. Добавьте,--type image
чтобы исправить это.for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
«Способ docker» - использовать автоматические сборки Docker Hub . Функция Repository Links перестроит ваш контейнер при перестроении вышестоящего контейнера, а функция Webhooks отправит вам уведомление.
Похоже, что веб-хуки ограничены вызовами HTTP POST. Вам нужно настроить службу, чтобы поймать их, или, возможно, использовать один из POST для отправки услуг электронной почты там.
Я не рассматривал это, но новая универсальная плоскость управления Docker может иметь функцию обнаружения обновленных контейнеров и повторного развертывания.
источник
Вы можете использовать Сторожевую башню, чтобы следить за обновлениями образа, из которого создается контейнер, и автоматически извлекать обновление и перезапускать контейнер, используя обновленное изображение. Однако это не решает проблему перестройки ваших собственных пользовательских изображений, когда есть изменения в исходном изображении, на котором оно основано. Вы можете рассматривать это как проблему, состоящую из двух частей: (1) знание того, когда вышестоящий образ был обновлен, и (2) выполнение фактического восстановления образа. (1) может быть решено довольно легко, но (2) во многом зависит от вашей локальной среды / практики сборки, поэтому, вероятно, гораздо сложнее создать обобщенное решение для этого.
Если вы можете использовать автоматические сборки Docker Hub , вся проблема может быть решена относительно чисто с помощью функции ссылок на репозиторий , которая позволяет автоматически запускать перестройку при обновлении связанного репозитория (возможно, вышестоящего). Вы также можете настроить webhook, чтобы уведомлять вас, когда происходит автоматическая сборка. Если вам нужно уведомление по электронной почте или SMS, вы можете подключить веб-крючок к IFTTT Maker . Я нахожу, что пользовательский интерфейс IFTTT немного сбивает с толку, но вы должны настроить веб-крючок Docker для публикации на https://maker.ifttt.com/trigger/
docker_xyz_image_built
/ с / key /your_key
.Если вам необходимо выполнить локальную сборку, вы можете, по крайней мере, решить проблему получения уведомлений при обновлении исходного изображения, создав фиктивное репо в Docker Hub, связанное с интересующими вас репозиториями. Единственная цель фиктивного репо состоит в том, чтобы вызвать веб-крючок, когда он будет перестроен (что означает, что одно из связанных с ним репо было обновлено). Если вы можете получить этот веб-крючок, вы можете даже использовать его, чтобы вызвать перестройку на своей стороне.
источник
REPO_USER
иREPO_PASS
переменные окружения. Посмотрите readme.md из Сторожевой башни для получения дополнительной информации: github.com/v2tec/watchtower#usageУ меня возникла та же проблема, и я подумал, что ее можно просто решить,
unattended-upgrade
ежедневно звоня на работу cron .Я намерен использовать это в качестве автоматического и быстрого решения для обеспечения безопасности и обновления производственного контейнера, поскольку мне может потребоваться некоторое время, чтобы обновить мои образы и развернуть новый образ докера с последними обновлениями безопасности.
Также возможно автоматизировать сборку и развертывание образа с помощью хитов Github.
Я создал базовый образ докера, который автоматически проверяет и устанавливает обновления безопасности ежедневно (может запускаться напрямую
docker run itech/docker-unattended-upgrade
).Я также столкнулся с другим подходом, чтобы проверить, нуждается ли контейнер в обновлении.
Моя полная реализация:
Dockerfile
Вспомогательные скрипты
устанавливать
Начало
редактировать
Я разработал небольшой инструмент docker-run, который запускается как докер-контейнер и может использоваться для обновления пакетов внутри всех или выбранных запущенных контейнеров, а также для запуска любых произвольных команд.
Может быть легко проверено с помощью следующей команды:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
который по умолчанию выполнит
date
команду во всех запущенных контейнерах и отобразит результаты. Если вы передадитеupdate
вместоexec
него, будет выполнятьсяapt-get update
послеapt-get upgrade -y
во всех запущенных контейнерахисточник
Kubernetes
что полезно для развертывания крупных инфраструктур, но Google все еще находится в стадии интенсивной разработки. На данный момент вы можете автоматизировать это с помощью инструмента обеспечения, такого как Ansible, довольно простым способом.Вы не знали бы, что ваш контейнер позади без запуска Docker Pull . Тогда вам нужно будет восстановить или перекомпоновать ваше изображение.
Команды могут быть помещены в сценарий вместе со всем, что необходимо для завершения обновления, хотя для правильного контейнера не потребуется ничего дополнительного.
источник
Управление зависимостями для образов Docker является реальной проблемой. Я являюсь частью команды, которая создала инструмент MicroBadger , который поможет с этим, отслеживая изображения контейнеров и проверяя метаданные. Одна из его функций - позволить вам настроить веб-крючок уведомлений, который вызывается при изменении интересующего вас изображения (например, базового изображения).
источник
Здесь много ответов, но ни один из них не отвечал моим потребностям. Я хотел получить реальный ответ на вопрос аскера № 1. Как узнать, когда изображение обновляется на hub.docker.com?
Приведенный ниже скрипт можно запускать ежедневно. При первом запуске он получает базовую линию тегов и даты обновления из реестра HUB и сохраняет их локально. После этого каждый раз при запуске он проверяет реестр на наличие новых тегов и дат обновления. Поскольку это меняется каждый раз, когда появляется новое изображение, оно сообщает нам, изменилось ли базовое изображение. Вот сценарий:
Вы захотите изменить
DATAPATH
переменную в верхней части и изменить команду уведомления по электронной почте в конце, чтобы удовлетворить ваши потребности. Для меня это SSH в сервер в другой сети, где мой SMTP расположен. Но вы также можете легко использоватьmail
команду.Теперь вы также хотите проверить наличие обновленных пакетов внутри самих контейнеров. На самом деле это, вероятно, более эффективно, чем выполнять «вытягивание», когда ваши контейнеры работают. Вот сценарий для этого:
источник
Другой подход может заключаться в том, чтобы предположить, что ваш базовый образ отстает довольно быстро (и это очень вероятно), и периодически запускать сборку вашего приложения (например, каждую неделю), а затем повторно развертывать его, если он изменился.
Насколько я могу судить, популярные базовые образы, такие как официальный Debian или Java, обновляют свои теги для исправления ошибок безопасности, поэтому теги не являются неизменяемыми (если вы хотите более надежную гарантию того, что вам нужно использовать ссылку [image: @digest] ], доступно в более поздних версиях Docker). Поэтому, если вы хотите создать свой образ
docker build --pull
, то ваше приложение должно получить самый последний и самый лучший из тегов базового изображения, на которые вы ссылаетесь.Поскольку изменяемые теги могут сбивать с толку, лучше увеличивать номер версии вашего приложения каждый раз, когда вы делаете это, чтобы, по крайней мере, с вашей стороны все было чище.
Поэтому я не уверен, что сценарий, предложенный в одном из предыдущих ответов, выполняет свою работу, поскольку он не перестраивает образ вашего приложения - он просто обновляет тег базового изображения, а затем перезапускает контейнер, но новый контейнер по-прежнему ссылается на старый хэш базового изображения.
Я бы не рекомендовал запускать задания типа cron в контейнерах (или любых других процессах, если это действительно не нужно), поскольку это противоречит мантре запуска только одного процесса на контейнер (есть разные аргументы о том, почему это лучше, поэтому я ' Я не собираюсь вдаваться в это здесь).
источник
Я не буду вдаваться в подробности того, хотите ли вы автоматических обновлений или нет (я думаю, что нет). Я просто оставляю это здесь для справки на случай, если кто-нибудь найдет это полезным. Обновите все ваши образы докеров до последней версии с помощью следующей команды в вашем терминале:
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
источник
# docker system prune -a --volumes -f
для очистки старых (висячих) изображений, томов и т. Д.ОБНОВЛЕНИЕ: используйте Dependabot - https://dependabot.com/docker/
BLUF: найти правильную точку вставки для отслеживания изменений в контейнере - это непростая задача. Было бы здорово, если бы DockerHub решил эту проблему. (Ссылки на репозиторий были упомянуты, но обратите внимание при их настройке в DockerHub - « Запускать сборку в этом репозитории всякий раз, когда базовый образ обновляется в Docker Hub. Работает только для неофициальных образов». )
Пытаясь решить эту проблему самостоятельно, я увидел несколько рекомендаций для веб-зацепок, поэтому я хотел бы остановиться на нескольких решениях, которые я использовал.
Используйте microbadger.com для отслеживания изменений в контейнере и используйте функцию уведомлений для запуска действия. Я настроил это на zapier.com (но вы можете использовать любой настраиваемый сервис webhook), чтобы создать новую проблему в моем репозитории github, которая использует Alpine в качестве базового образа.
Отслеживайте RSS-канал для git коммитов в верхний контейнер. ех. https://github.com/gliderlabs/docker-alpine/commits/rootfs/library-3.8/x86_64 . Я использовал zapier.com для мониторинга этого канала и запуска автоматической сборки моего контейнера в Travis-CI каждый раз, когда что-то совершается. Это немного экстремально, но вы можете изменить триггер, чтобы делать другие вещи, такие как открытие проблемы в вашем git-репозитории для ручного вмешательства.
источник
Предпосылка к моему ответу:
Подходить
Кроме того, базовый образ может быть обновлен / контейнер с полным новым базовым образом может быть построен через регулярные промежутки времени, так как сопровождающий считает необходимым
преимущества
источник
Выше Ответы также верны
Есть два подхода
Я просто делюсь сценарием, может быть, это будет полезно для вас! Вы можете использовать его с cronjob, я успешно попробовал на OSX
Вот мой файл docker-compose
источник
Поместите работу через
$ crontab -e
:Создать
~/.docker
каталог с файломcron.sh
:источник
Вы пробовали это: https://github.com/v2tec/watchtower . это простой инструмент, работающий в докер-контейнере, наблюдающий за другими контейнерами; если их базовое изображение изменилось, он извлечет и повторно развернет.
источник
Простое и отличное решение - пастух
источник