web-dev-qa-db-fra.com

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 devons souvent reconstruire tout ou partie de nos images. Mais nous rencontrons souvent des échecs lors du téléchargement de packages avec apt-get install, même immédiatement après avoir exécuté 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 spécifique d'un paquet particulier a été supprimée de l'archive et remplacée par une version de correctif légèrement différente. Par exemple, l'erreur ci-dessus est à la recherche de 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.

Ceci est souvent résolu en supprimant l’image de base (docker rmi ubuntu:14.04) et la reconstruction; l'image ubuntu récemment téléchargée a le numéro de correctif correct et trouve le bon fichier d'archive. Mais même cela ne fonctionne pas toujours - probablement à cause d'un délai entre une nouvelle mise à jour mineure de la base de données de dépendance d'Ubuntu et le déploiement de cette nouvelle ubuntu:14.04 image sur Docker Hub.

Nous avons essayé d'utiliser apt-get drapeaux --fix-missing et --fix-broken et ceux qui ne fonctionnent pas toujours non plus.

D'autres idées?

apt-get install échoue avec l'erreur Not Found parce que le paquet a été supprimé du référentiel est un problème similaire, mais la réponse acceptée est inacceptable car il est impossible de l'automatiser. Notre processus de développement quotidien, y compris la construction et le déploiement automatiques, est entièrement écrit avec Docker et il n’est pas pratique de pirater un fichier Docker à chaque fois qu’une archive disparaît (puis retirez le piratage après quelques heures ou quelques jours).


En réponse à @ prateek05, voici le /etc/apt/sources.list du fonctionnaire ubuntu:14.04 image de 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
41
AlexChaffee

Vous avez indiqué que votre fichier Docker contient RUN apt-get -y update En tant que propre instruction RUN. Cependant, en raison de mise en cache de construction , si toutes les modifications apportées au fichier Dockerfile se produisent ultérieurement dans le fichier, lorsque docker build Est exécuté, Docker réutilisera l'image intermédiaire créée la dernière fois RUN apt-get -y update est exécuté au lieu d'exécuter à nouveau la commande. Ainsi, les lignes apt-get install récemment ajoutées ou éditées utiliseront les anciennes données, ce qui entraînera les erreurs que vous avez observées.

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

  1. Passez l'option --no-cache À docker build, Forçant chaque instruction du fichier Docker à s'exécuter chaque fois que l'image est construite.

  2. Réécrivez le fichier Dockerfile pour combiner les commandes apt-get En une seule instruction RUN: RUN apt-get update && apt-get install foo bar .... De cette façon, chaque fois que la liste des paquets à installer est modifiée, docker build Sera obligé d'exécuter à nouveau l'intégralité de l'instruction RUN et, par conséquent, de réexécuter apt-get update Avant de procéder à l'installation.

La page des meilleures pratiques de Dockerfile contient en fait ne section entière sur les commandes apt-get Dans Dockerfiles . Je vous suggère de le lire.

110
jwodder

Le problème pourrait être potentiellement avec les sources Ubuntu

Vérifier /etc/apt/sources.list

Si tu vois deb http://archive.ubuntu.com/ubuntu main universe restricted multiverse, cela pourrait être le problème potentiel.

Corrigez cela en le remplaçant par deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse

Sinon, 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

Remplacez archive.ubuntu.com par un miroir plus fiable, par exemple us.archive.ubuntu.com

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

(édité par le demandeur oiriginal):

Merci, prateek05! Mon fichier Docker 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 cela semble fonctionner. Mais puisqu'il s'agit d'un problème sporadique, seul le temps nous le dira ...

6
prateek05