ошибка в docker сборке - Err: 1 http://deb.debian.org/debian stretch / main amd64 unzip amd64 6.0-21 + deb9u1 404 Not Found - PullRequest
0 голосов
/ 09 мая 2020

Я делаю сборку docker на своем MacBook Pro, и она всегда дает сбой со следующей ошибкой:

Reading package lists...
Building dependency tree...
Reading state information...
Suggested packages:
  zip
The following NEW packages will be installed:
  unzip
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 170 kB of archives.
After this operation, 547 kB of additional disk space will be used.
Err:1 http://deb.debian.org/debian stretch/main amd64 unzip amd64 6.0-21+deb9u1
  404  Not Found
E: Failed to fetch http://deb.debian.org/debian/pool/main/u/unzip/unzip_6.0-21+deb9u1_amd64.deb  404  Not Found
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?
The command '/bin/sh -c apt-get install unzip' returned a non-zero code: 100

docker версия: Docker версия 19.03.8, сборка afacb8b

MacOS: Mojave 10.14.6

Фрагмент файла Docker:

FROM debian:latest
RUN apt-get update
RUN apt-get install -y ca-certificates
RUN apt-get install unzip

Сборка отлично работает в нашем Travis CI, который использует docker -ce = 17.09.0 ~ ce -0 ~ ubuntu

Есть предложения, как отладить его дальше? Первоначально мы думали, что это может быть временная проблема на стороне debian, но проблема не исчезла, поэтому, вероятно, проблема в моей среде.

1 Ответ

0 голосов
/ 09 мая 2020

Объедините три строки RUN, которые вы показываете, в одну команду:

FROM debian:latest
RUN apt-get update \
 && apt-get install -y \
      ca-certificates \
      unzip

Существует комбинация двух вещей, которая приводит к этой ошибке 404. С одной стороны, Docker будет кэшировать отдельные шаги Dockerfile: он видит, что, начиная с debian:latest, это уже RUN apt-get update, поэтому он использует версию этой команды со вчерашнего дня. С другой стороны, Debian довольно часто обновляет свои репозитории, добавляя очень незначительные обновления (см. +deb9u1 часть этого номера версии), и когда они это делают, они удаляют предыдущую версию из своих репозиториев. Эта комбинация означает, что вы можете находиться в последовательности, в которой вы используете кешированную версию индекса apt-get update, но версия пакета, которую он упоминает, больше не существует.

Объединение этих строк вместе, как это, означает Docker всегда будет запускать и apt-get update, и apt-get install вместе; если вы добавите пакет в список, он повторно запустит шаг update перед попыткой загрузки. Это позволяет избежать этой проблемы за счет небольшого дополнительного времени загрузки при изменении списка пакетов.

...