Quando e por que devo usar o apt-get update?

15

Pergunta geral:

Alguns poderiam explicar o que o comando apt-get updatefaz 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 installsem 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 updatecomando em um horário diferente, o resultado seja diferente e, portanto, minhas imagens sejam diferentes.

Pierre-Jean
fonte
Acho que este post poderia servir como um artigo wiki sobre como fazer uma pergunta de alto nível. Muito útil.
Zerodf

Respostas:

12

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 updateantes 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 ,.

Patrick
fonte
Ótima resposta! Obrigado! Quero reagir ao parágrafo "(...) não reconstruir o contêiner toda vez. Isso garantirá que você não obtenha um contêiner diferente que não tenha sido testado". Li que a melhor prática é nunca usar o apt-get upgrade. Um dos motivos seria: "Ele também produz imagens inconsistentes porque você não tem mais uma fonte de verdade sobre como o aplicativo deve ser executado e quais versões de dependências estão incluídas na imagem". Não é o mesmo problema com apt-get updateentão? E o Dockerfile não deve garantir a imagem?
Pierre-Jean
2
Meio. apt-get updateafetará apenas pacotes recém-instalados. Pacotes existentes serão atualizados somente se necessário pelos novos pacotes (isso deve ser mínimo). Com apt-get upgradevocê, 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.
194 Patrick Patrick
0

Alguns poderiam explicar o que o comando apt-get update faz e quando devo usá-lo?

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.18para, 5.7.19mas não para 6.x.

Onde está armazenado o índice do pacote? Em um banco de dados? Em um arquivo?

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.

O que acontece se eu instalar o apt-get sem atualizar o cache?

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 jessieimagens 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.

Existe uma chance de que o pacote remoto não exista mais e que o link seja quebrado?

Definitivamente, porque as versões armazenadas no índice são muito precisas 5.7.19(simplificação; são mais parecidas com 5.7.19-0ubuntu1).

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?

É 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.18no subsequente apt-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.

giorgiosironi
fonte