En Docker, apt-get install falla con "Failed to fetch http://archive.ubuntu.com / ... 404 No encontrado" errores. ¿Por qué? ¿Cómo podemos superarlo?


Mi equipo utiliza Docker (con ubuntu:14.04 imagen base) para el desarrollo local y a menudo tenemos que reconstruir algunas o todas nuestras imágenes. Pero a menudo tenemos fallos al descargar paquetes con apt-get install, incluso inmediatamente después de ejecutar apt-get -y update. Por ejemplo, hoy veo

Err http://archive.ubuntu.com/ubuntu/ trusty-security/main libxml2 amd64 2.9.1+dfsg1-3ubuntu4.7
  404  Not Found [IP: 91.189.88.161 80]
Err http://archive.ubuntu.com/ubuntu/ trusty-security/main libxml2-dev amd64 2.9.1+dfsg1-3ubuntu4.7
  404  Not Found [IP: 91.189.88.161 80]
Fetched 84.7 MB in 1min 6s (1281 kB/s)
Unable to correct missing packages.
E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/libx/libxml2/libxml2_2.9.1+dfsg1-3ubuntu4.7_amd64.deb  404  Not Found [IP: 91.189.88.161 80]

E: Failed to fetch http://archive.ubuntu.com/ubuntu/pool/main/libx/libxml2/libxml2-dev_2.9.1+dfsg1-3ubuntu4.7_amd64.deb  404  Not Found [IP: 91.189.88.161 80]

E: Aborting install.

Aparentemente la versión específica de un paquete en particular ha sido eliminada del archivo y reemplazada por una versión de parche con un nombre ligeramente diferente. Por ejemplo, el error anterior está buscando libxml2_2.9.1+dfsg1-3ubuntu4.7_amd64.deb pero la versión en el servidor es libxml2_2.9.1+dfsg1-3ubuntu4.8_amd64.deb.

A menudo esto se puede resolver eliminando la imagen base (docker rmi ubuntu:14.04) y reconstruyendo; la imagen de ubuntu recién descargada tiene el número de parche correcto y encuentra el archivo de archivo correcto. Pero incluso esto no siempre funciona probably probablemente debido a un retraso entre una nueva actualización menor a la base de datos de dependencias de Ubuntu y el despliegue de esa nueva imagen ubuntu:14.04 en Docker Hub.

Hemos intentado usar apt-get banderas --fix-missing y --fix-broken y esos no funcionan consistentemente bien.

¿Alguna otra idea?

Apt-get install falla con el error No Encontrado porque el paquete eliminado del repositorio es un problema similar, pero la respuesta aceptada es inaceptable porque no es posible ser automatizado. Nuestro proceso de desarrollo diario, que incluye la compilación e implementación automáticas, está escrito y utiliza Docker y no es práctico hackear dentro de un archivo Dockerfile cada vez que un archivo en particular desaparece (luego elimine el hack después de unas horas o jornadas).


En respuesta a @prateek05, aquí está el /etc/apt/sources.list de la imagen docker oficial ubuntu:14.04:

root@72daa1942714:/# cat /etc/apt/sources.list
# See http://help.ubuntu.com/community/UpgradeNotes for how to upgrade to
# newer versions of the distribution.

deb http://archive.ubuntu.com/ubuntu/ trusty main restricted
deb-src http://archive.ubuntu.com/ubuntu/ trusty main restricted

## Major bug fix updates produced after the final release of the
## distribution.
deb http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted
deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates main restricted

## Uncomment the following two lines to add software from the 'universe'
## repository.
## N.B. software from this repository is ENTIRELY UNSUPPORTED by the Ubuntu
## team. Also, please note that software in universe WILL NOT receive any
## review or updates from the Ubuntu security team.
deb http://archive.ubuntu.com/ubuntu/ trusty universe
deb-src http://archive.ubuntu.com/ubuntu/ trusty universe
deb http://archive.ubuntu.com/ubuntu/ trusty-updates universe
deb-src http://archive.ubuntu.com/ubuntu/ trusty-updates universe

## N.B. software from this repository may not have been tested as
## extensively as that contained in the main release, although it includes
## newer versions of some applications which may provide useful features.
## Also, please note that software in backports WILL NOT receive any review
## or updates from the Ubuntu security team.
# deb http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted
# deb-src http://archive.ubuntu.com/ubuntu/ trusty-backports main restricted

deb http://archive.ubuntu.com/ubuntu/ trusty-security main restricted
deb-src http://archive.ubuntu.com/ubuntu/ trusty-security main restricted
deb http://archive.ubuntu.com/ubuntu/ trusty-security universe
deb-src http://archive.ubuntu.com/ubuntu/ trusty-security universe
# deb http://archive.ubuntu.com/ubuntu/ trusty-security multiverse
# deb-src http://archive.ubuntu.com/ubuntu/ trusty-security multiverse
Author: Community, 2016-06-08

3 answers

Ha indicado que su Dockerfile contiene RUN apt-get -y update como su propia instrucción RUN. Sin embargo, debido a build caching, si todos los cambios en el Dockerfile ocurren más tarde en el archivo, cuando se ejecuta docker build, Docker reutilizará la imagen intermedia creada la última vez que RUN apt-get -y update se ejecutó en lugar de ejecutar el comando nuevamente, por lo que cualquier línea apt-get install recientemente agregada o editada utilizará datos antiguos, lo que llevará a los errores que ha observado.

Hay dos maneras de arreglar esto:

  1. Pase la opción --no-cache a docker build, forzando que cada instrucción en el Dockerfile se ejecute cada vez que se compile la imagen.

  2. Reescriba el Dockerfile para combinar los comandos apt-get en una única instrucción RUN: RUN apt-get update && apt-get install foo bar .... De esta manera, cada vez que se edite la lista de paquetes a instalar, docker build se verá obligado a volver a ejecutar la instrucción completa RUN y así volver a ejecutar apt-get update antes de instalar.

El Dockerfile mejores prácticas page en realidad tiene una sección completa sobre apt-get comandos en Dockerfiles. Le sugiero que lo lea.

 80
Author: jwodder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-09 13:55:15

El problema podría ser potencialmente con las fuentes de ubuntu

Compruebe /etc/apt/sources.list

Si ves deb http://archive.ubuntu.com/ubuntu main universe restricted multiverse, ese podría ser el problema potencial.

Arregla eso reemplazándolo por deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse

Alternativamente, podría ser que el propio espejo no responda. archive.ubuntu.com

Name:   archive.ubuntu.com
Address: 91.189.88.152
Name:   archive.ubuntu.com
Address: 91.189.88.161
Name:   archive.ubuntu.com
Address: 91.189.88.149

Sustitúyase archive.ubuntu.com con un espejo más confiable decir us.archive.ubuntu.com

Name:   us.archive.ubuntu.com
Address: 91.189.91.23
Name:   us.archive.ubuntu.com
Address: 91.189.91.26

(edit by the oirriginal asker):

Gracias, prateek05! Mi Dockerfile ahora comienza:

FROM ubuntu:14.04
RUN sed -i'' 's/archive\.ubuntu\.com/us\.archive\.ubuntu\.com/' /etc/apt/sources.list
RUN apt-get -y update

Y parece estar funcionando. Pero como este es un problema esporádico, solo el tiempo lo dirá...

 6
Author: prateek05,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-08 17:58:07

El uso de fuentes FTP funciona el 100% del tiempo.

RUN echo \
   'deb ftp://ftp.us.debian.org/debian/ jessie main\n \
    deb ftp://ftp.us.debian.org/debian/ jessie-updates main\n \
    deb http://security.debian.org jessie/updates main\n' \
    > /etc/apt/sources.list
 -2
Author: Danny G,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-10-13 23:13:39