run - En Docker, la instalación de apt-get falla con los errores "Error al recuperar http://archive.ubuntu.com/... 404 Not Found". ¿Por qué? ¿Cómo podemos pasarlo?
uninstall docker ubuntu (3)
Mi equipo usa 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 obtenemos errores 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 se ha eliminado del archivo y se ha reemplazado 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, probablemente debido a un retraso entre una nueva actualización menor a la dependencia de Ubuntu db y el despliegue de esa nueva ubuntu:14.04
imagen en Docker Hub.
Hemos intentado usar apt-get
flags --fix-missing
y --fix-broken
y tampoco funcionan de manera consistente.
¿Alguna otra idea?
La instalación de apt-get 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 automatizar. Nuestro proceso de desarrollo diario, que incluye creación e implementación automáticas, está todo guionado y usando Docker y no es práctico hackear dentro de un archivo Docker cada vez que un archivo en particular se pierde (y luego eliminar el truco después de unas pocas horas o días).
En respuesta a @ prateek05, aquí está la /etc/apt/sources.list
de la imagen oficial de ubuntu:14.04
docker:
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
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.
Arregle eso reemplazándolo con deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse
Alternativamente, podría ser que el espejo en sí 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
Reemplace archive.ubuntu.com con un espejo de mayor confianza diga us.archive.ubuntu.com
Name: us.archive.ubuntu.com
Address: 91.189.91.23
Name: us.archive.ubuntu.com
Address: 91.189.91.26
(editar por el asker inicial):
Gracias, prateek05! My 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 que funciona. Pero como se trata de un problema esporádico, solo el tiempo dirá ...
Ha declarado que su archivo Docker contiene RUN apt-get -y update
como su propia instrucción RUN
. Sin embargo, debido al almacenamiento en caché , si todos los cambios en el archivo Docker ocurren más adelante en el archivo, cuando Docker se ejecuta, Docker reutilizará la imagen intermedia creada la última vez que se ejecutó RUN apt-get -y update
lugar de ejecutar el comando nuevamente. por lo tanto, las líneas de apt-get install
recientemente agregadas o editadas utilizarán datos antiguos, lo que dará lugar a los errores que ha observado.
Hay dos formas de solucionar esto:
Pase la
--no-cache
a la compilación de Docker, forzando cada sentencia en Dockerfile a ejecutarse cada vez que se construye la imagen.Vuelva a escribir el archivo Docker para combinar los comandos
apt-get
en una sola instrucciónRUN apt-get update && apt-get install foo bar ...
:RUN apt-get update && apt-get install foo bar ...
De esta forma, cada vez que se edite la lista de paquetes para instalar,docker build
se verá obligado a volver a ejecutar toda la instrucciónRUN
y, por lo tanto, volver a ejecutarapt-get update
antes de la instalación.
La página de mejores prácticas de Dockerfile en realidad tiene una sección completa sobre apt-get
comandos apt-get
en Dockerfiles . Te sugiero que lo leas.
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