Could some explain what the command apt-get update does and when I really should use it?
apt-get update
faz o download de índices atualizados dos repositórios de pacotes da distribuição, listando todos os pacotes disponíveis e suas versões precisas.
Distribuições comuns como Ubuntu e Debian são geralmente conservadoras e retrocompatíveis em suas ofertas de pacotes, então as versões não mudam muito ao longo do tempo; eles serão alterados devido a atualizações de segurança ou correções de bugs. Por exemplo, o mysql pode ser atualizado de 5.7.18
para 5.7.19
mas não para 6.x
.
Where is stored the package index? On a database? On a file?
Geralmente é armazenado em um ou mais arquivos dentro de /var/lib/apt
. No contexto do Docker, esses arquivos estão dentro da imagem. Ao construir o Dockerfile, eles são armazenados nas novas camadas do sistema de arquivos que são criadas e persistidas como a imagem recém-criada.
What happens if I do apt-get install without updating the cache?
Você pode tentar baixar versões de pacotes que não existem mais. Isso é bastante comum em máquinas virtuais, mas é possível dentro de contêineres também se os repositórios de distribuição lançarem novos pacotes após a construção da imagem base. Pode não haver coordenação entre os mantenedores da distribuição e os mantenedores do Dockerfile, que estão a jusante da distribuição e podem ser maiores em número. Existe apenas um repositório Debian, mas milhares de imagens de contêiner jessie
-based e Dockerfile.
Além disso, algumas imagens do upstream, como a do ubuntu remova o índice baixado para tornar a imagem menor e evite arquivos desatualizados. Por isso, espera-se que um índice atualizado seja baixado ao construir em cima de uma imagem de base, não para cada versão de uma imagem de base fornecida com o índice mais recente.
Is there a chance that the remote package would not exist anymore and that the link would be broken?
Definitivamente, porque as versões armazenadas no índice são muito precisas como 5.7.19
(simplificação; elas são mais parecidas com 5.7.19-0ubuntu1
).
Is there some agreed politic about deb repositories? For example, should a repository only contains the last version of a package, or on the contrary should it contains all versions available for a specific distribution release?
É comum que pequenas versões antigas sejam removidas rapidamente assim que uma atualização estiver disponível; Suponho que isso é para economizar espaço nos servidores, pois os binários podem pesar várias dezenas de megabytes, multiplicados por todas as versões e arquiteturas suportadas. Por isso, geralmente é impossível definir, por exemplo, mysql-5.7.18
no apt-get install
subsequente; assim que mysql-5.7.19
for liberado na distribuição, o anterior será removido.
Para ser justo com o Docker, esse não-determinismo de apt-get update
é um problema que é trazido como parte do gerenciamento de pacotes de cada distribuição. Você teria o mesmo problema ao tentar construir repetitivamente uma máquina virtual EC2 ou Vagrant.
Alguns administradores de sistema usam serviços como Aptly para espelhar os repositórios originais e conseguir fixar uma versão específica, mas você executa o risco de perder atualizações de segurança, a menos que você tenha um processo separado executado com freqüência para testar as atualizações e alterar o que você está definindo.