Pergunta geral:
Alguns poderiam explicar o que o comando apt-get update
faz e quando eu realmente devo usá-lo?
Observações
Por favor, dê uma resposta detalhada . Não é apenas uma cópia da página de manual, a menos que sua versão seja realmente detalhada (coloquei uma definição da página de manual abaixo).
apt-get update : Usado para sincronizar novamente os arquivos de índice de pacotes de suas fontes. Os índices dos pacotes disponíveis são buscados nos locais especificados em /etc/apt/sources.list(5). Uma atualização sempre deve ser realizada antes de uma atualização ou dist-upgrade.
Sub-perguntas:
- Onde está armazenado o índice do pacote? Em um banco de dados? Em um arquivo?
- O que acontece se eu fizer
apt-get install
sem atualizar o cache? Existe uma chance de que o pacote remoto não exista mais e que o link seja quebrado? - Existe alguma política acordada sobre repositórios deb? Por exemplo, um repositório deve conter apenas a última versão de um pacote ou, pelo contrário, deve conter todas as versões disponíveis para uma liberação de distribuição específica?
Contexto
Faço minha pergunta porque estou estudando a estrutura do Docker . Um de seus recursos é o Dockerfile , que permite criar uma espécie de imagem do sistema operacional executando algumas instruções desse arquivo. Uma propriedade dessa imagem é que ela deve sempre ser a mesma, seja qual for o contexto (hora da criação, etc.).
Receio que, se eu iniciar o apt-get update
comando em um horário diferente, o resultado seja diferente e, portanto, minhas imagens sejam diferentes.
Respostas:
apt-get update
baixa a lista de pacotes disponíveis.A lista de pacotes pode mudar com o tempo. Novos pacotes são adicionados e pacotes antigos são removidos. Portanto, se você tem um cache muito antigo e tenta fazer um
apt-get install
, ele pode tentar baixar um pacote que não existe mais.Quanto tempo um pacote antigo é mantido em um repositório depende do mantenedor do repositório (sua distribuição). Como tal, se você estiver usando algo como janela de encaixe, onde o cache pode estar muito desatualizado, você sempre deve executar
apt-get update
antes de instalar qualquer pacote.O motivo para remover e adicionar pacotes são principalmente correções de bugs e atualizações de segurança. Embora se você estiver usando acordos de recompra de terceiros como o PPA, vale tudo.
Ao usar algo como janela de encaixe para contêiner em um ambiente corporativo, você deve compilar o contêiner uma vez e, em seguida, movê-lo pelos seus vários ambientes de liberação (desenvolvimento, preparo, produção) e não reconstruir o contêiner toda vez. Isso garantirá que você não obtenha um recipiente diferente que não tenha sido testado.
Para responder sua pergunta sobre onde estão os arquivos de cache,
/var/lib/apt/lists
,.fonte
apt-get update
então? E o Dockerfile não deve garantir a imagem?apt-get update
afetará apenas pacotes recém-instalados. Pacotes existentes serão atualizados somente se necessário pelos novos pacotes (isso deve ser mínimo). Comapt-get upgrade
você, atualize todos os pacotes, incluindo os existentes, resultando em uma imagem muito diferente. Embora isso possa resultar em um resultado diferente cada vez que você cria a partir do arquivo docker, pessoalmente não acho que esse seja um problema sério se você passar por uma versão de vários ambientes. Eu acho que isso é mais um problema se você distribuir o arquivo docker para outras pessoas e pedir que elas o construam.apt-get update
baixa í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 compatíveis com versões anteriores em suas ofertas de pacotes, portanto as versões não mudam muito com o 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 para6.x
.Geralmente é armazenado em um ou mais arquivos dentro
/var/lib/apt
. No contexto do Docker, esses arquivos estão dentro da imagem. Ao criar 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.Você pode tentar baixar versões de pacotes que não existem mais. Isso é bastante comum em máquinas virtuais, mas também é possível dentro de contêineres se os repositórios de distribuição tiverem liberado novos pacotes após a criaçã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
jessie
imagens de contêineres e Dockerfile.Além disso, algumas imagens upstream como a do ubuntu removem o índice baixado para diminuir a imagem e evitar arquivos desatualizados. Portanto, espera-se que um índice atualizado seja baixado ao criar uma imagem de base, não para que cada versão de uma imagem de base seja enviada com o índice mais recente.
Definitivamente, porque as versões armazenadas no índice são muito precisas
5.7.19
(simplificação; são mais parecidas com5.7.19-0ubuntu1
).É comum que as versões secundárias antigas sejam removidas rapidamente assim que uma atualização estiver disponível; Suponho que isso economize espaço nos servidores, pois os binários podem pesar várias dezenas de megabytes, multiplicados por todas as versões e arquiteturas suportadas. Portanto, geralmente é impossível fixar, digamos,
mysql-5.7.18
no subsequenteapt-get install
; assim quemysql-5.7.19
for lançado na distribuição, o anterior será removido.Para ser justo com Docker, esse não determinismo de
apt-get update
é um problema trazido como parte do gerenciamento de pacotes de cada distribuição. Você teria o mesmo problema ao tentar criar repetidamente uma máquina virtual EC2 ou Vagrant.Alguns administradores de sistema usam serviços como o Aptly para espelhar os repositórios originais e podem fixar uma versão específica, mas você corre o risco de perder atualizações de segurança, a menos que tenha um processo separado, frequentemente executado, para testar as atualizações e alterar o que você deseja. estão fixando.
fonte