Como manter os aplicativos nas próprias imagens do Docker atualizadas?

3

Digamos que minha própria imagem do Docker seja baseada na imagem do Debian e eu instale o Apache usando o RUN apt-get.

Quando a imagem básica é atualizada, preciso remover meu contêiner e criar um novo. Isso pode ser automatizado, por ex. com a Torre de Vigia.

Mas como posso manter o aplicativo dentro do contêiner (Apache no meu exemplo) atualizado? A imagem base não muda apenas porque um problema de segurança em um pacote que não é enviado com a imagem base foi corrigido. Quando eu crio um novo contêiner com o meu Dockerfile, o Apache ainda não é atualizado graças ao cache de imagens do Docker.

Como posso lidar com atualizações de aplicativos tão fácil quanto seria se eu instalasse o Apache no host usando o gerenciador de pacotes?

    
por scaup 10.07.2017 / 17:46

3 respostas

1

Você pode usar o gerenciamento de configuração adequado com sistemas como SaltStack, Chef, Ansible ou Puppet. Eles permitem que você gerencie precocemente as versões de software, instalações, atualizações e faça o gerenciamento dos arquivos de configuração reais.

    
por 10.07.2017 / 19:35
0

O procedimento é:

  • Construa novas imagens. Para as etapas que mudam, você pode passar um argumento de construção não utilizado como uma variável que muda com cada construção e força o cache a ser invalidado. Ou você pode reconstruir a imagem inteira com as opções --pull --no-cache , que também atualizam a imagem base.
  • Salve as imagens em seu registro se estiver executando isso em vários nós (ou executando-o em uma máquina diferente do servidor de construção).
  • Atualize os contêineres em execução. Com a composição, você pode executar docker-compose pull && docker-compose up -d . Com o swarm, você pode executar o docker stack deploy -c compose.yml --with-registry-auth e ele puxará a versão mais recente do registro a partir do release 17.06. Se você chamar docker run manualmente, precisará chamar o docker pull apropriado primeiro (para extrair a imagem do registro) e excluir / recriar seu contêiner.

Para automatizar tudo isso, uma ferramenta CI-CD, como Jenkins, GoCD, Drone.io, etc, seria usada para executar todas essas etapas.

    
por 10.07.2017 / 23:07
0

Execute o 'docker build' com '--no-cache --pull' para garantir que ele sempre use uma nova imagem de base e não tente reutilizar camadas armazenadas em cache para atualizações de pacotes.

Você pode configurar um comentário de 'cache buster' na metade do seu Dockerfile (por exemplo, na linha onde você executa o apt-get) para garantir que ele seja sempre executado. Por exemplo:

Dockerfile:

ARG CACHEBUST=1
RUN apt-get update && apt-get upgrade # $CACHEBUST

ao criar, defina o buildarg como, por exemplo, o PID atual ou $ RANDOM para sempre reconstruir a partir dessa linha:

docker --build-arg CACHEBUST=$$

ou para reconstruir uma vez por dia

docker --build-arg CACHEBUST='date +%Y%m%d'
    
por 10.07.2017 / 18:52

Tags