¿Podrían algunos explicar qué hace el comando apt-get update y cuándo realmente debería usarlo?
apt-get update
descarga índices actualizados de los repositorios de paquetes de la distribución, enumerando todos los paquetes disponibles y sus versiones precisas.
Las distribuciones comunes como Ubuntu y Debian suelen ser conservadoras y compatibles con versiones anteriores en sus ofertas de paquetes, por lo que las versiones no cambiarán mucho con el tiempo; cambiarán debido a actualizaciones de seguridad o correcciones de errores. Por ejemplo, mysql podría actualizarse de 5.7.18
a 5.7.19
pero no a 6.x
.
¿Dónde se almacena el índice del paquete? En una base de datos? En un archivo?
Por lo general, se almacena en uno o más archivos dentro /var/lib/apt
. En el contexto de Docker, estos archivos están dentro de la imagen. Al compilar el Dockerfile, se almacenan en las nuevas capas del sistema de archivos que se crean y persisten como la imagen recién creada.
¿Qué sucede si hago apt-get install sin actualizar el caché?
Puede intentar descargar versiones de paquetes que ya no existen. Esto es bastante común en las máquinas virtuales, pero también es posible dentro de los contenedores si los repositorios de distribución han lanzado nuevos paquetes después de la creación de la imagen base. Puede que no haya coordinación entre los mantenedores de distribución y los mantenedores de Dockerfile, que están aguas abajo de la distribución y pueden ser más grandes en número. Solo hay un repositorio de Debian, pero miles de jessie
imágenes de contenedor basadas en Dockerfile.
Además, algunas imágenes ascendentes como la de Ubuntu eliminan el índice descargado para hacer que la imagen sea más pequeña y evitar archivos obsoletos allí. Por lo tanto, se espera que se descargue un índice actualizado cuando se construye encima de una imagen base, no para cada versión de una imagen base que se envíe con el último índice.
¿Existe la posibilidad de que el paquete remoto ya no exista y que el enlace se rompa?
Definitivamente, porque las versiones almacenadas en el índice son muy precisas como 5.7.19
(simplificación; son más similares a 5.7.19-0ubuntu1
).
¿Existe alguna política acordada sobre los repositorios de Deb? Por ejemplo, ¿debería un repositorio solo contener la última versión de un paquete o, por el contrario, debería contener todas las versiones disponibles para un lanzamiento de distribución específico?
Es común que las versiones menores anteriores se eliminen rápidamente una vez que hay una actualización disponible; Supongo que esto es para ahorrar espacio en los servidores, ya que los archivos binarios pueden pesar varias decenas de megabytes, multiplicados por todas las versiones y arquitecturas compatibles. Por lo tanto, generalmente es imposible fijar, por ejemplo, mysql-5.7.18
en el subsiguiente apt-get install
; tan pronto como mysql-5.7.19
se publique en la distribución, se eliminará la anterior.
Para ser justos con Docker, este no determinismo apt-get update
es un problema que se plantea como parte de la gestión de paquetes de cada distribución. Tendría el mismo problema al intentar construir repetidamente una máquina virtual EC2 o Vagrant.
Algunos administradores de sistemas utilizan servicios como Aptly para reflejar los repositorios originales y poder fijar una versión en particular, pero corre el riesgo de perderse las actualizaciones de seguridad a menos que tenga un proceso separado que se ejecute con frecuencia para probar las actualizaciones y cambiar lo que están clavados