Qualcuno potrebbe spiegare cosa fa il comando apt-get update e quando dovrei davvero usarlo?
apt-get update
scarica gli indici aggiornati dai repository di pacchetti della distribuzione, elencando tutti i pacchetti disponibili e le loro versioni precise.
Le distribuzioni comuni come Ubuntu e Debian sono generalmente conservative e retrocompatibili nelle loro offerte di pacchetti, quindi le versioni non cambieranno molto nel tempo; cambieranno a causa di aggiornamenti di sicurezza o correzioni di bug. Ad esempio, mysql potrebbe essere aggiornato da 5.7.18
a 5.7.19
ma non a 6.x
.
Dove è memorizzato l'indice del pacchetto? Su un database? Su un file?
Di solito è memorizzato in uno o più file all'interno /var/lib/apt
. Nel contesto di Docker, questi file sono all'interno dell'immagine. Quando creano il Dockerfile, vengono archiviati nei nuovi livelli del filesystem che vengono creati e resi persistenti come l'immagine appena costruita.
Cosa succede se eseguo apt-get install senza aggiornare la cache?
Puoi provare a scaricare versioni di pacchetti che non esistono più. Questo è abbastanza comune nelle macchine virtuali, ma è possibile anche all'interno dei container se i repository di distribuzione hanno rilasciato nuovi pacchetti dopo la creazione dell'immagine di base. Potrebbe non esserci alcun coordinamento tra i manutentori della distribuzione e i manutentori Dockerfile, che sono a valle della distribuzione e possono essere di numero maggiore. Esiste un solo repository Debian ma migliaia di jessie
immagini contenitore e Dockerfile basati su.
Inoltre, alcune immagini a monte come Ubuntu rimuovono l'indice scaricato per rendere l'immagine più piccola ed evitare file obsoleti lì. Quindi si prevede che un indice aggiornato debba essere scaricato quando si costruisce sopra un'immagine di base, non per ogni versione di un'immagine di base da spedire con l'indice più recente.
È possibile che il pacchetto remoto non esista più e che il collegamento venga interrotto?
Sicuramente, perché le versioni memorizzate nell'indice sono molto precise come 5.7.19
(semplificazione; sono più simili a 5.7.19-0ubuntu1
).
C'è qualche politica concordata sui repository deb? Ad esempio, un repository dovrebbe contenere solo l'ultima versione di un pacchetto o, al contrario, dovrebbe contenere tutte le versioni disponibili per una versione di distribuzione specifica?
È comune che le vecchie versioni secondarie vengano rimosse rapidamente quando è disponibile un aggiornamento; Suppongo che questo sia per risparmiare spazio sui server poiché i binari possono pesare diverse decine di megabyte, moltiplicati per tutte le versioni e le architetture supportate. Quindi di solito è impossibile appuntare, diciamo, mysql-5.7.18
nel successivo apt-get install
; non appena mysql-5.7.19
viene rilasciato nella distribuzione, quello precedente verrà rimosso.
Per essere onesti con Docker, questo non determinismo di apt-get update
è un problema che viene introdotto come parte della gestione dei pacchetti di ogni distribuzione. Avresti lo stesso problema nel provare a costruire ripetutamente una macchina virtuale EC2 o Vagrant.
Alcuni amministratori di sistema utilizzano servizi come Aptly per eseguire il mirroring dei repository originali ed essere in grado di bloccare una versione particolare, ma si corre il rischio di perdere gli aggiornamenti di sicurezza a meno che non si disponga di un processo separato eseguito di frequente per testare gli aggiornamenti e modificare ciò che si stanno bloccando.