In Docker mislukt de installatie van apt-get met de foutmelding “Kan http://archive.ubuntu.com/ … 404 niet gevonden” niet ophalen. Waarom? Hoe komen we er voorbij?

Mijn team gebruikt Docker (met ubuntu:14.04basisimage) voor lokale ontwikkeling en we moeten vaak sommige of al onze images opnieuw opbouwen. Maar we krijgen vaak fouten bij het downloaden van pakketten met apt-get install, zelfs onmiddellijk na het uitvoeren van apt-get -y update. Vandaag zie ik bijvoorbeeld

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.

Blijkbaar is de specifieke versie van een bepaald pakket uit het archief verwijderd en vervangen door een patchversie met een iets andere naam. De bovenstaande fout is bijvoorbeeld op zoek naar libxml2_2.9.1+dfsg1-3ubuntu4.7_amd64.debmaar de versie op de server is libxml2_2.9.1+dfsg1-3ubuntu4.8_amd64.deb.

Vaak is dit op te lossen door de basisafbeelding te verwijderen (docker rmi ubuntu:14.04) en opnieuw op te bouwen; de nieuw gedownloade ubuntu-afbeelding heeft het juiste patchnummer en vindt het juiste archiefbestand. Maar zelfs dit werkt niet altijd — waarschijnlijk vanwege een vertraging tussen een nieuwe kleine upgrade naar Ubuntu’s dependency db en de implementatie van die nieuwe ubuntu:14.04afbeelding op Docker Hub.

We hebben geprobeerd de apt-get-vlaggen --fix-missingen --fix-brokente gebruiken en die werken niet consistent werk ook niet.

Heeft u nog andere ideeën?

apt-get installatie mislukt met niet gevonden fout omdat pakket verwijderd uit repositoryeen soortgelijk probleem is, maar het geaccepteerde antwoord is onaanvaardbaar omdat het niet mogelijk is om te worden geautomatiseerd. Ons dagelijkse ontwikkelingsproces, inclusief automatisch bouwen en implementeren, is volledig gescript en maakt gebruik van Docker en het is niet praktisch om telkens in een Dockerfile te hacken wanneer een bepaald archief zoekraakt (verwijder de hack vervolgens na een paar uur of dagen).


Als reactie op @prateek05 is hier de /etc/apt/sources.listvan de officiële ubuntu:14.04docker-afbeelding:

[email protected]:/# 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

Antwoord 1, autoriteit 100%

U heeft aangegeven dat uw Dockerfile RUN apt-get -y updatebevat als zijn eigen RUN-instructie. Echter, vanwege caching bouwen, als alle wijzigingen in het Dockerfile later in het bestand voorkomen, wanneer docker buildwordt uitgevoerd, zal Docker de tussenafbeelding die de laatste keer dat RUN apt-get -y updateis gemaakt, opnieuw gebruiken in plaats van de opdracht opnieuw uit te voeren , en dus zullen alle recent toegevoegde of -bewerkte apt-get install-regels oude gegevens gebruiken, wat leidt tot de fouten die je hebt opgemerkt.

Er zijn twee manieren om dit op te lossen:

  1. Geef de optie --no-cachedoor aan docker build, waardoor elke instructie in de Dockerfile elke keer dat de afbeelding wordt gebouwd, moet worden uitgevoerd.

  2. Herschrijf het Docker-bestand om de apt-get-opdrachten te combineren in een enkele RUN-instructie: RUN apt-get update && apt-get install foo bar .... Op deze manier zal docker build, telkens wanneer de lijst met te installeren pakketten wordt bewerkt, gedwongen worden om de volledige RUN-instructie opnieuw uit te voeren en dus apt-get updatealvorens te installeren.

De pagina met best practices voor Dockerfileheeft eigenlijk een hele sectie over apt-get-opdrachten in Dockerfiles. Ik raad je aan het te lezen.


Antwoord 2, autoriteit 7%

Het probleem kan mogelijk te maken hebben met de ubuntu-bronnen

Controleer /etc/apt/sources.list

Als u deb http://archive.ubuntu.com/ubuntu main universe restricted multiverseziet, kan dat het potentiële probleem zijn.

Los dit op door het te vervangen door deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse

Het kan ook zijn dat de spiegel zelf niet reageert. 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

Vervang archive.ubuntu.com door een meer vertrouwde mirror, bijvoorbeeld us.archive.ubuntu.com

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

(bewerkt door de oorspronkelijke vrager):

Bedankt, prateek05! Mijn Dockerfile begint nu:

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

en het lijkt te werken. Maar aangezien dit een sporadisch probleem is, zal de tijd het leren…


Antwoord 3

iets gevonden dat werkt!

dus ik vond dit:
https://www.mail-archive.com/ [email protected]/msg5682159.html

De oplossing is om een ​​pinning_filete maken met de inhoud

# Written by ubuntu-advantage-tools
Package: *
Pin: release o=UbuntuESM, n=trusty
Pin-Priority: never

voeg vervolgens toe

COPY pinning_file /etc/apt/preferences.d/ubuntu-esm-infra-trusty

aan u Dockerfilevoordat u de sudo apt-get -y update

uitvoert


Antwoord 4

In mijn geval werd het probleem veroorzaakt door de bovenliggende afbeelding, omdat deze de apt-cache niet goed had gewist.

Ik los het probleem op, inclusief opschoningsopdrachten vóór de eerste apt-update …

RUN apt clean && \
    rm -rf /var/lib/apt/lists/* && \
    apt update && \
    ...

Hopelijk helpt dit


Antwoord 5

Ik kon deze fout pas oplossen nadat ik wat extra argumenten had toegevoegd aan apt-getom http-problemen op te lossen:

sudo apt-get \
  -o Acquire::BrokenProxy="true" \
  -o Acquire::http::No-Cache="true" \ 
  -o Acquire::http::Pipeline-Depth="0" install \
    ignition

Antwoord 6

Wat voor mij werkte …

Ik had de instructies in twee regels, maar toen ik ze samenvoegde tot één, werkte het (weet niet of het cachegerelateerd was …)

het was

RUN apt-get -y update && apt-get upgrade -y
# Install tools && libraries
RUN apt-get -y install --fix-missing apt-utils iputils-ping nano wget dialog \
    build-essential git zip  \

En toen veranderde ik in

RUN apt-get -y update && apt-get upgrade -y \
    && apt-get -y install --fix-missing apt-utils nano wget \
    git zip  \
    mysql-client \

Antwoord 7

Het gebruik van FTP-bronnen werkt 100% van de tijd.

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

Other episodes