Digamos que eu tenha um contêiner trivial baseado no ubuntu:latest
. Agora, há uma atualização de segurança e ubuntu:latest
é atualizada no repositório de encaixe.
Como saberia se minha imagem local e seus contêineres estão atrasados?
Existe alguma prática recomendada para atualizar automaticamente imagens e contêineres locais para seguir as atualizações de repositório do docker, que na prática dariam as mesmas vantagens de ter atualizações autônomas em execução em uma máquina ubuntu convencional
docker
automatic-updates
hbogert
fonte
fonte
Respostas:
Uma das maneiras de fazer isso é direcionar isso pelos sistemas de CI / CD. Depois que sua imagem pai for criada, tenha algo que varre seus repositórios git em busca de imagens usando esse pai. Se encontrado, você enviaria uma solicitação de recebimento para encontrar novas versões da imagem. A solicitação de recebimento, se todos os testes forem aprovados, seria mesclada e você teria uma nova imagem filha com base no pai atualizado. Um exemplo de ferramenta que adota essa abordagem pode ser encontrado aqui: https://engineering.salesforce.com/open-sourcing-dockerfile-image-update-6400121c1a75 .
Se você não controlar sua imagem pai, como seria o caso, dependendo da
ubuntu
imagem oficial , poderá escrever algumas ferramentas que detectam alterações na tag ou na soma de verificação da imagem pai (não é a mesma coisa, as tags são mutáveis) e invocar filhos que a imagem cria de acordo.fonte
Usamos um script que verifica se um contêiner em execução é iniciado com a imagem mais recente. Também usamos scripts init iniciados para iniciar a imagem do docker.
E init parece
fonte
redis
),LATEST=`docker inspect --format "{{.Id}}" $IMAGE`
obterá as informações do contêiner. Adicione--type image
para corrigir isso.for IMAGE in $(docker ps --format {{.Image}} -q | sort -u)
Uma 'maneira do docker' seria usar as compilações automatizadas do hub do docker . O recurso Links de Repositório reconstruirá seu contêiner quando um contêiner upstream for reconstruído, e o recurso Webhooks enviará uma notificação.
Parece que os webhooks estão limitados a chamadas HTTP POST. Você precisaria configurar um serviço para capturá-los ou talvez usar um dos POST para enviar serviços por e-mail.
Ainda não examinei, mas o novo Docker Universal Control Plane pode ter um recurso para detectar contêineres atualizados e reimplementar.
fonte
Você pode usar a Torre de Vigia para procurar atualizações na imagem da qual um contêiner é instanciado, puxar automaticamente a atualização e reiniciar o contêiner usando a imagem atualizada. No entanto, isso não resolve o problema de reconstruir suas próprias imagens personalizadas quando há uma alteração na imagem upstream em que ela se baseia. Você pode ver isso como um problema de duas partes: (1) saber quando uma imagem upstream foi atualizada e (2) fazer a reconstrução real da imagem. (1) pode ser resolvido com bastante facilidade, mas (2) depende muito do seu ambiente / práticas de construção local, por isso é provavelmente muito mais difícil criar uma solução generalizada para isso.
Se você puder usar as compilações automatizadas do Docker Hub , todo o problema poderá ser resolvido de forma relativamente limpa usando o recurso de links do repositório , que permite ativar uma reconstrução automaticamente quando um repositório vinculado (provavelmente um upstream) é atualizado. Você também pode configurar um webhook para notificá-lo quando ocorrer uma compilação automatizada. Se desejar uma notificação por email ou SMS, você poderá conectar o webhook ao IFTTT Maker . Achei a interface do usuário IFTTT um pouco confusa, mas você configuraria o webhook do Docker para postar em https://maker.ifttt.com/trigger/
docker_xyz_image_built
/ com / key /your_key
.Se precisar criar localmente, você pode pelo menos resolver o problema de receber notificações quando uma imagem upstream for atualizada criando um repositório fictício no Docker Hub vinculado aos seus repositórios de interesse. O único objetivo do repositório fictício seria acionar um webhook quando ele fosse reconstruído (o que implica que um de seus repositórios vinculados foi atualizado). Se você conseguir receber esse webhook, poderá usá-lo para desencadear uma reconstrução do seu lado.
fonte
REPO_USER
eREPO_PASS
. Dê uma olhada no readme.md da Torre de Vigia para obter mais informações: github.com/v2tec/watchtower#usageEu tive o mesmo problema e pensei que ele pode ser simplesmente resolvido por um trabalho cron ligando
unattended-upgrade
diariamente.Minha intenção é ter isso como uma solução automática e rápida para garantir que o contêiner de produção seja seguro e atualizado, pois pode levar algum tempo para atualizar minhas imagens e implantar uma nova imagem de janela de encaixe com as atualizações de segurança mais recentes.
Também é possível automatizar a criação e implantação da imagem com ganchos do Github
Criei uma imagem básica do Docker, que verifica e instala automaticamente atualizações de segurança diariamente (pode ser executada diretamente por
docker run itech/docker-unattended-upgrade
).Também deparei com outra abordagem diferente para verificar se o contêiner precisa de uma atualização.
Minha implementação completa:
Dockerfile
Scripts auxiliares
instalar
começar
Editar
Desenvolvi uma pequena ferramenta docker-run que é executada como contêiner de docker e pode ser usada para atualizar pacotes dentro de todos ou em contêineres em execução selecionados; também pode ser usada para executar qualquer comando arbitrário.
Pode ser facilmente testado com o seguinte comando:
docker run --rm -v /var/run/docker.sock:/tmp/docker.sock itech/docker-run exec
que por padrão executará o
date
comando em todos os contêineres em execução e exibirá os resultados. Se você passar emupdate
vezexec
dele, será executadoapt-get update
seguido porapt-get upgrade -y
todos os contêineres em execuçãofonte
Kubernetes
que é útil para a implantação de grandes infraestruturas, mas ainda está em desenvolvimento pesado pelo Google. No momento, você pode automatizar isso com uma ferramenta de provisionamento como o Ansible de uma maneira bastante simples.Você não saberia que seu contêiner está atrasado sem executar o docker pull . Você precisará reconstruir ou recompor sua imagem.
Os comandos podem ser colocados em um script junto com qualquer outra coisa necessária para concluir a atualização, embora um contêiner adequado não precise de mais nada.
fonte
O gerenciamento de dependências para imagens do Docker é um problema real. Faço parte de uma equipe que construiu uma ferramenta, o MicroBadger , para ajudar com isso, monitorando imagens de contêineres e inspecionando metadados. Um de seus recursos é permitir que você configure um webhook de notificação chamado quando uma imagem em que você está interessado (por exemplo, uma imagem de base) é alterada.
fonte
Há muitas respostas aqui, mas nenhuma delas atendeu às minhas necessidades. Eu queria uma resposta real para a pergunta nº 1 do autor. Como sei quando uma imagem é atualizada no hub.docker.com?
O script abaixo pode ser executado diariamente. Na primeira execução, ele obtém uma linha de base das tags e atualiza as datas do registro do HUB e as salva localmente. Desde então, toda vez que é executado, ele verifica o registro em busca de novas tags e datas de atualização. Como isso muda toda vez que uma nova imagem existe, informa se a imagem base foi alterada. Aqui está o script:
Você deseja alterar a
DATAPATH
variável na parte superior e o comando de notificação por email no final para atender às suas necessidades. Para mim, eu tenho o SSH em um servidor em outra rede onde meu SMTP está localizado. Mas você também pode usar omail
comando facilmente .Agora, você também deseja verificar os pacotes atualizados dentro dos próprios contêineres. Isso é provavelmente mais eficaz do que fazer um "puxão" quando seus contêineres estiverem funcionando. Aqui está o script para fazer isso:
fonte
Outra abordagem pode ser assumir que sua imagem de base fica para trás rapidamente (e é muito provável que isso aconteça) e forçar outra compilação de imagem de seu aplicativo periodicamente (por exemplo, toda semana) e depois reimplantá-lo se ele tiver sido alterado.
Até onde eu sei, imagens de base populares como o Debian ou Java oficial atualizam suas tags para atender a correções de segurança, para que as tags não sejam imutáveis (se você quiser uma garantia mais forte de que precisa usar a referência [image: @digest ], disponível nas versões mais recentes do Docker). Portanto, se você construir sua imagem
docker build --pull
, seu aplicativo deverá obter a melhor e mais recente etiqueta de imagem básica à qual você está referenciando.Como as tags mutáveis podem ser confusas, é melhor aumentar o número da versão do seu aplicativo toda vez que você fizer isso, para que pelo menos do seu lado tudo fique mais limpo.
Portanto, não tenho certeza de que o script sugerido em uma das respostas anteriores funcione, pois ele não reconstrói a imagem do aplicativo - apenas atualiza a tag da imagem base e reinicia o contêiner, mas o novo contêiner ainda faz referência o antigo hash da imagem base.
Eu não recomendaria a execução de tarefas do tipo cron em contêineres (ou qualquer outro processo, a menos que seja realmente necessário), pois isso contraria o mantra de executar apenas um processo por contêiner (existem vários argumentos sobre por que isso é melhor, então eu ' não vou entrar aqui).
fonte
Não vou entrar na questão de saber se você deseja ou não atualizações autônomas na produção (acho que não). Só estou deixando isso aqui para referência, caso alguém ache útil. Atualize todas as imagens do docker para a versão mais recente com o seguinte comando no seu terminal:
# docker images | awk '(NR>1) && ($2!~/none/) {print $1":"$2}' | xargs -L1 docker pull
fonte
# docker system prune -a --volumes -f
para limpar antigos (pendurados) imagens, volumes etc.ATUALIZAÇÃO: Use Dependabot - https://dependabot.com/docker/
BLUF: encontrar o ponto de inserção correto para monitorar alterações em um contêiner é o desafio. Seria ótimo se o DockerHub resolvesse isso. (Os links do repositório foram mencionados, mas observe ao configurá-los no DockerHub - " Acione uma compilação neste repositório sempre que a imagem base for atualizada no Docker Hub. Funciona apenas para imagens não oficiais." )
Enquanto tentava resolver isso sozinho, vi várias recomendações para webhooks, por isso queria elaborar algumas soluções que usei.
Use o microbadger.com para rastrear alterações em um contêiner e use o recurso de webhook de notificação para acionar uma ação. Configurei isso com o zapier.com (mas você pode usar qualquer serviço personalizável de webhook) para criar um novo problema no meu repositório do github que usa o Alpine como imagem de base.
Acompanhe o feed RSS para as confirmações do git em um contêiner upstream. ex. https://github.com/gliderlabs/docker-alpine/commits/rootfs/library-3.8/x86_64 . Usei o zapier.com para monitorar este feed e acionar uma compilação automática do meu contêiner no Travis-CI sempre que algo for confirmado. Isso é um pouco extremo, mas você pode alterar o gatilho para fazer outras coisas, como abrir um problema no seu repositório git para intervenção manual.
fonte
Premissa para a minha resposta:
Abordagem
Além disso, a imagem de base pode ser atualizada / o contêiner com uma nova imagem de base completa pode ser construído em intervalos regulares, conforme o mantenedor achar necessário
Vantagens
fonte
As respostas acima também estão corretas
Existem duas abordagens
Estou apenas compartilhando script, pode ser que seja útil para você! Você pode usá-lo com cronjob, tentei com sucesso no OSX
Aqui está o meu arquivo docker-compose
fonte
Coloque o trabalho via
$ crontab -e
:Crie o diretório
~/.docker
com o arquivocron.sh
:fonte
você já tentou isso: https://github.com/v2tec/watchtower . é uma ferramenta simples em execução no contêiner do docker que observa outros contêineres; se a imagem base for alterada, ela será puxada e reimplantada.
fonte
Uma solução simples e ótima é pastor
fonte