77 votes

Dans Docker, l'installation d'apt-get échoue avec les erreurs "Echec de l'extraction de http://archive.ubuntu.com/ ... 404 Not Found". Pourquoi? Comment pouvons-nous aller au-delà?

Mon équipe utilise Docker (avec ubuntu:14.04 image de base) pour le développement local et nous nous sommes souvent à la reconstruction de certaines ou de l'ensemble de nos images. Mais nous recevons souvent des échecs de téléchargement des paquets avec apt-get install, même immédiatement après l'exécution de l' apt-get -y update. Par exemple, aujourd'hui, je vois

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.

Apparemment, la version particulière d'un paquet particulier a été supprimé à partir de l'archive et l'a remplacé avec un peu différemment nommé version du patch. Par exemple, l'erreur ci-dessus est à la recherche d' libxml2_2.9.1+dfsg1-3ubuntu4.7_amd64.deb , mais la version sur le serveur est - libxml2_2.9.1+dfsg1-3ubuntu4.8_amd64.deb.

Souvent, cela est résoluble par la suppression de l'image de base (docker rmi ubuntu:14.04) et de la reconstruction; la nouvellement téléchargé ubuntu image a le bon numéro de patch et trouve le bon fichier d'archive. Mais même cela ne fonctionne pas toujours, probablement en raison d'un retard entre une nouvelle mise à jour mineur pour Ubuntu dépendance db et le déploiement de la nouvelle - ubuntu:14.04 image sur Docker Hub.

Nous avons essayé d'utiliser apt-get drapeaux --fix-missing et --fix-broken , et ceux-ci ne sont pas toujours du travail.

D'autres idées?

apt-get install échoue et ne Trouve Pas d'erreur parce que le package retiré de dépôt est un problème similaire, mais l'on a accepté la réponse est inacceptable parce qu'il n'est pas possible d'être automatisé. Le quotidien de nos processus de développement, y compris l'automatique à construire et à déployer, tout est scripté et l'utilisation de Docker et c'est pas pratique pour pirater autour à l'intérieur d'un Dockerfile à chaque fois une archive particulière vient à manquer (puis supprimer le hack après quelques heures ou quelques jours).


En réponse à @prateek05, voici l' /etc/apt/sources.list officiel, ubuntu:14.04 docker image:

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

189voto

jwodder Points 13193

Vous avez déclaré que votre Dockerfile contient RUN apt-get -y update que sa propre RUN enseignement. Toutefois, en raison de construire la mise en cache, si toutes les modifications apportées à la Dockerfile se produire plus tard dans le fichier, docker build est exécuté, Docker va réutiliser l'image intermédiaire a créé la dernière fois RUN apt-get -y update exécuté à la place de l'exécution de la commande de nouveau, et tout récemment ajoutés ou modifiés apt-get install des lignes en utilisant les données anciennes, conduisant à des erreurs que vous avez observé.

Il ya deux façons de résoudre ce problème:

  1. Passer l' --no-cache option d' docker build, obligeant chaque instruction dans le Dockerfile être exécutée chaque fois que l'image est construite.

  2. Réécrire le Dockerfile de combiner l' apt-get des commandes dans un seul RUN enseignement: RUN apt-get update && apt-get install foo bar .... De cette façon, chaque fois que la liste des paquets à installer est édité, docker build sera obligé de se ré-exécuter l'ensemble de l' RUN enseignement et donc réexécuter apt-get update avant l'installation.

Le Dockerfile meilleures pratiques page a en fait toute une section sur apt-get des commandes dans les Dockerfiles. Je vous suggère de le lire.

12voto

prateek05 Points 306

La question pourrait être potentiellement avec ubuntu sources

Vérifiez /etc/apt/sources.list

Si vous voyez deb http://archive.ubuntu.com/ubuntu main universe restricted multiverse , qui pourrait être le problème potentiel.

Correctif pour la remplacer par deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse

Alternativement, il pourrait être le miroir lui-même ne répond pas. 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

Remplacer archive.ubuntu.com avec une plus grande confiance, miroir dis 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 par le oiriginal asker):

Merci, prateek05! Mon Dockerfile commence maintenant:

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

et il semble fonctionner. Mais puisque c'est un sporadiques problème, seul le temps nous le dira...

-3voto

Danny G Points 2124

L'utilisation de sources FTP fonctionne 100% du temps.

 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
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X