2015-08-31 11 views
10

Sembrerebbe che apt-get stia avendo problemi di connessione con i server del repository. Suppongo che sia probabile problemi di compatibilità, come menzionato here, tuttavia la soluzione proposta di apt-get clean non funziona per me. Inoltre sono sorpreso, se questo è il caso, che non ci sono più persone che hanno il mio problema.Docker Debian apt Errore di lettura dal server

MWE

Dockerfile

FROM debian:jessie 
RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends \ 
    git 
$ docker build . 
docker build . 
Sending build context to Docker daemon 2.048 kB 
Step 0 : FROM debian:jessie 
---> 4a5e6db8c069 
Step 1 : RUN apt-get clean && apt-get update && apt-get install -y --no-install-recommends  git 
---> Running in 43b93e93feab 
Get:1 http://security.debian.org jessie/updates InRelease [63.1 kB] 
... some omitted ... 
Get:6 http://httpredir.debian.org jessie-updates/main amd64 Packages [3614 B] 
Fetched 9552 kB in 7s (1346 kB/s) 
Reading package lists... 
Reading package lists... 
Building dependency tree... 
Reading state information... 
The following extra packages will be installed: 
... some omitted ... 
0 upgraded, 26 newly installed, 0 to remove and 0 not upgraded. 
Need to get 13.2 MB of archives. 
After this operation, 64.0 MB of additional disk space will be used. 
Get:1 http://security.debian.org/ jessie/updates/main libgnutls-deb0-28 amd64 3.3.8-6+deb8u2 [694 kB] 
... some omitted ... 
Get:5 http://httpredir.debian.org/debian/ jessie/main libnettle4 amd64 2.7.1-5 [176 kB] 
Err http://httpredir.debian.org/debian/ jessie/main libffi6 amd64 3.1-2+b2 
    Error reading from server. Remote end closed connection [IP: 176.9.184.93 80] 
... some omitted ... 
Get:25 http://httpredir.debian.org/debian/ jessie/main git amd64 1:2.1.4-2.1 [3624 kB] 
Fetched 13.2 MB in 10s (1307 kB/s) 
E: Failed to fetch http://httpredir.debian.org/debian/pool/main/libf/libffi/libffi6_3.1-2+b2_amd64.deb Error reading from server. Remote end closed connection [IP: 176.9.184.93 80] 

E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing? 
The command '/bin/sh -c apt-get clean && apt-get update && apt-get install -y --no-install-recommends  git' returned a non-zero code: 100 

Si prega di notare che ho anche postato here con un problema diverso. Credo che non sia correlato, ma potrebbe davvero esserlo.

risposta

5

Lo specchio httpredir.debian.org è "magico" in quanto consente il bilanciamento del carico e il geo-ip per aumentare le prestazioni e la disponibilità. Pertanto, sospetterei immediatamente che causi il tuo problema, o almeno sia la prima cosa da escludere.

Vorrei verificare se fosse possibile:

  • Ancora riprodurre il problema; httpredir.debian.org eliminerà i mirror "cattivi" dai relativi elenchi interni, pertanto il problema potrebbe essere stato temporaneo.

  • Riprodurre il problema con uno specchio diverso, non httpredir.debian.org. Prova qualcosa come ftp.de.debian.org. Se funziona quindi con questo mirror, si prega di contattare il manutentore httpredir.debian.org e segnalare il problema a loro. Sono abbastanza reattivi e aperti a segnalazioni di bug.

+0

Sì, avevi ragione, ero in grado di riprodurre il problema in modo consistente la scorsa settimana, anche in più giorni, tuttavia il codice di cui sopra funziona perfettamente ora. Sono stato in grado di eseguire il MWE sopra due volte con successo. Suppongo che ciò evidenzi le sfortunate carenze e limitazioni del livello di riproducibilità del docker – Gilly

5

ho aggiunto alla mia apt-get clean dockerfile prima della linea apt-get update, sembra aver fatto il trucco.

Immagino non ho modo di sapere se fosse o meno il comando in più o se è stata fortuna che fissa la mia generazione, ma ho preso il consiglio da https://github.com/CGAL/cgal-testsuite-dockerfiles/issues/19

1

Per chi visita con problemi simili, utilizzando il Il flag --no-cache nel file docker build potrebbe essere di aiuto. Problemi simili (sebbene non esatti) possono verificarsi se l'aggiornamento di apt-get è obsoleto e non viene richiamato in causa per la memorizzazione nella cache.

+0

Il --no-cache ha risolto questo problema per me. Grazie mille! – donatJ

12

Per chi sta avendo un problema con questo, questo è il mio tentativo di "fissare" il problema sostituendo httpredir con un singolo dominio di lavoro ogni volta che il Dockerfile è in costruzione:

FROM debian:je... 

# Insert this line before "RUN apt-get update" to dynamically 
# replace httpredir.debian.org with a single working domain 
# in attempt to "prevent" the "Error reading from server" error. 
RUN sed -i "s/httpredir.debian.org/`curl -s -D - http://httpredir.debian.org/demo/debian/ | awk '/^Link:/ { print $2 }' | sed -e 's@<http://\(.*\)/debian/>;@\[email protected]'`/" /etc/apt/sources.list 

# Continue with your apt-get update... 
RUN apt-get update... 

Che questo comando fa è:

  1. Curl il http://httpredir.debian.org/demo/debian/ dalla macchina edificio per ottenere le intestazioni di pagina debian demo (. -s tace, non emettono -D è quello di scaricare le intestazioni)
  2. Estrai le intestazioni, trova il frammento di intestazione Link. Questo contiene il percorso migliore raccomandato da httpredir.
  3. L'ultimo sed -e ... consiste nell'estrarre il nome di dominio del collegamento nel passaggio 2.
  4. Infine, il dominio trovato nel passaggio 3 viene inserito nel comando globale sed e sostituisce il dominio httpredir.debian.org trovato in /etc/apt/sources.list.

Questa non è una correzione, ma piuttosto un semplice hack per ridurre (molto) le possibilità di build falliti. E ... scusami se sembra strano, dato che è il mio tentativo di piping della mia vergine sed &.

Modifica

Una nota a parte, se il dominio che raccoglie semplicemente troppo lento o non risponde come dovrebbe, si consiglia di farlo manualmente da

  1. Visita http://httpredir.debian.org/demo.html, e si dovrebbe vedere un collegamento lì come http://......./debian/. Per esempio, in corrispondenza del punto di scrittura, ho visto http://mirrors.tuna.tsinghua.edu.cn/debian/

  2. Invece di lungo comando di RUN sed -i...., utilizzare questo invece:

    RUN sed -i "s/httpredir.debian.org/mirrors.tuna.tsinghua.edu.cn/" /etc/apt/sources.list 
    
+0

Questa è l'unica soluzione che ho trovato per l'uso in un Dockerfile (o altro script che non riesce su ogni codice di ritorno). Il suggerimento apt-get clean che ho visto in alcuni punti non ha funzionato in modo affidabile. –

+0

Haha quelle cache chiare e quello che non mi mancherà sempre. Questo è l'unico modo veloce e sporco per farlo funzionare in modo quasi perfetto. Anche se a volte lento. –

+0

Ho riscontrato costantemente questo problema con le build di binari nella finestra mobile. quanto sopra lo ha risolto. – sakurashinken

1

Non abbastanza reputazione per commentare risposte precedenti, così sarò (confusamente) aggiungere una nuova risposta:

  • non credo hardcoding un singolo specchio è davvero una soluzione praticabile, poiché, come per esempio visto here, th C'è una ragione per cui debian ha implementato l'intera cosa httpredir: gli specchi sono andati giù o non sono più aggiornati.
  • Ho affrontato questo problema un sacco di volte, e i registri indicano sempre che la finestra mobile sta effettivamente eseguendo il comando apt-get, il che significa che --no-cache è improbabile che lo risolva - è solo che se tu Ricostruisci, httpredir probabilmente sceglierà un mirror diverso, anche se non cambi nulla nel tuo file docker, e la build funzionerà.
+0

Fino a quando non escono con una correzione, non penso che ci sia ancora una soluzione per questo. La mia soluzione non riguardava la codifica rigida di una singola fonte, ma piuttosto la aiuta a sceglierne una funzionante e funzionante, e si attacca a quella specifica sessione di costruzione fino alla sua conclusione. –

Problemi correlati