Pré-carregar imagens do docker com um ISO para redistribuição

7

Estamos desenvolvendo um aplicativo que será implantado no site em várias instalações (não na nuvem). Nosso parceiro de OEM está pedindo que forneçamos um ISO para poder provisionar rapidamente novos servidores. Nosso aplicativo é construído em torno de contêineres e temos uma configuração de registro privada voltada para a Internet para poder extrair as versões mais recentes. Eu ainda não tenho certeza se o parceiro OEM será capaz de puxar essas imagens, por isso estamos investigando a possibilidade de pré-embalar as imagens docker junto com o ISO, mas estão tendo algumas dificuldades. Algumas coisas que tentamos:

  1. systemback - Tentamos provisionar uma nova instalação do Ubuntu com nossa configuração preferida (conforme definido por um papel ansible que temos) e então capturando o resultado com o systemback. Após a reinstalação do ISO resultante, nos deparamos com um erro do docker: Error response from daemon: open /var/lib/docker/aufs/layers/blahblahblah: no such file or directory semelhante a # 22343

  2. chroot jail - Novamente, tentamos criar nosso usuário, instalando o docker, mas ao tentar puxar as nossas imagens somos recebidos com: failed to register layer: Error processing tar file(exit status 1): invalid argument independentemente da imagem que puxamos (mesmo imagem oficial do docker do ubuntu, por exemplo). O Google não ajuda em nada com esse erro.

  3. RancherOS - Aqui encontramos instruções para imagens do docker de pré-armazenamento mas não como junte-os com o iso . Parece que estamos tendo o mesmo caso de uso que # 1449 , mas não há uma solução real.

Agora tudo o que posso pensar em tentar é docker save de nossas imagens e incluir os tarballs com o ISO, então, ao iniciar o iso, executar um script para verificar se as imagens do docker existem ou não e se não , faça um docker load em cada um e então execute-os embora isso pareça extremamente hacky e não confiável, então eu estava me perguntando se alguém tem alguma experiência com esse tipo de coisa e pode ser capaz de me apontar na direção certa.

    
por DTI-Matt 20.02.2017 / 16:27

1 resposta

0

@ A resposta de Michael Hampton parece certa para mim.

O que eu sugiro é que você empacote os scripts systemd relevantes em seu ISO, e faça com que esses scripts lidem com o carregamento ou a construção de suas imagens.

Assim, para um contêiner nginx, o arquivo de sua unidade pode ser semelhante:

[Unit]
Description=nginx
After=docker.service
Requires=docker.service


[Service]
TimeoutStartSec=0
ExecStartPre=-/usr/bin/docker kill nginx
ExecStartPre=-/usr/bin/docker rm nginx
ExecStartPre=-/usr/bin/docker load /path/to/compressed/image
ExecStart=/usr/bin/docker run --rm [your config here]

Se você preferir criar em vez de carregar, também poderá fazer isso substituindo:

ExecStartPre=-/usr/bin/docker load /path/to/compressed/image

Com:

ExecStartPre=-/usr/bin/docker build --rm -t 'my-nginx:latest' /path/to/folder_with_Dockerfile

Você também pode usar dependências do systemd para garantir que as coisas sejam iniciadas na ordem correta e / ou vinculem os contêineres (veja, por exemplo, After / Before , PartOf , e assim por diante) do systemd.

Em geral, acho que não gastaria muito tempo me preocupando com apenas carregar / compilar uma vez - especialmente se você fosse criar imagens (em vez de carregá-las), isso permitiria que você atualizasse um contêiner atualizando seu Dockerfile local. O que pode ser um recurso útil se o seu registro não estiver disponível.

    
por 02.03.2017 / 14:08