Подтвердить что ты не робот

В Docker apt-get install завершается с ошибкой "Не удалось получить ошибки http://archive.ubuntu.com/... 404 Not Found". Зачем? Как мы можем пройти мимо него?

Моя команда использует Docker (с базовым изображением ubuntu:14.04) для локального развития, и нам часто приходится перестраивать некоторые или все наши изображения. Но мы часто получаем сбои при загрузке пакетов с помощью apt-get install, даже сразу после запуска apt-get -y update. Например, сегодня я вижу

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.

По-видимому, конкретная версия конкретного пакета была удалена из архива и заменена несколько иначе названной версией патча. Например, указанная выше ошибка ищет libxml2_2.9.1+dfsg1-3ubuntu4.7_amd64.deb, но версия на сервере libxml2_2.9.1+dfsg1-3ubuntu4.8_amd64.deb.

Часто это разрешимо, удаляя базовое изображение (docker rmi ubuntu:14.04) и перестраивая; недавно загруженное изображение ubuntu имеет правильный номер патча и находит правильный архив. Но даже это не всегда срабатывает - возможно, из-за задержки между новым незначительным обновлением до db Ubuntu и развертыванием этого нового образа ubuntu:14.04 на Docker Hub.

Мы попытались использовать флаги apt-get --fix-missing и --fix-broken, и они тоже не работают.

Любые другие идеи?

Ошибка apt-get с ошибкой Not Found, потому что пакет, удаленный из репозитория, является аналогичной проблемой, но принятый ответ неприемлем, потому что его невозможно автоматизировать. Наш ежедневный процесс разработки, включая автоматическую сборку и развертывание, все сценарии и использование Docker, и нецелесообразно взламывать внутри Dockerfile каждый раз, когда какой-либо архив пропадает (затем удалите хак через несколько часов или дней).


В ответ на @prateek05, здесь /etc/apt/sources.list из официального изображения докеры ubuntu:14.04:

[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
4b9b3361

Ответ 1

Вы заявили, что ваш файл Dockerfile содержит RUN apt-get -y update как свою собственную инструкцию RUN. Однако из-за кэширования сборки, если все изменения в файле Docker появятся позже в файле, когда docker build будет запущен, Docker будет повторно использовать промежуточное изображение, созданное в последний раз RUN apt-get -y update выполняется вместо повторного запуска команды, поэтому любые недавно добавленные или -edited строки apt-get install будут использовать старые данные, что приведет к обнаруженным ошибкам.

Есть два способа исправить это:

  • Передайте параметр --no-cache в docker build, заставляя каждый оператор в файле Docker запускаться каждый раз при создании изображения.

  • Перепишите файл Docker для объединения команд apt-get в одну инструкцию RUN: RUN apt-get update && apt-get install foo bar .... Таким образом, всякий раз, когда редактируется список пакетов для установки, docker build будет принудительно повторно выполнить всю команду RUN и, таким образом, перезапустить apt-get update перед установкой.

В странице лучших практик Dockerfile есть весь раздел команд apt-get в файлах Dockerfiles. Я предлагаю вам прочитать его.

Ответ 2

Проблема может быть потенциально связана с источниками ubuntu

Проверьте /etc/apt/sources.list

Если вы видите deb http://archive.ubuntu.com/ubuntu main universe restricted multiverse, это может быть потенциальной проблемой.

Исправьте это, заменив его deb http://archive.ubuntu.com/ubuntu/ trusty main universe restricted multiverse

В качестве альтернативы это может быть само зеркало не отвечает. 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

Замените archive.ubuntu.com на более надежное зеркало, скажем us.archive.ubuntu.com

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

(отредактируйте официантка):

Спасибо, prateek05! Теперь начинается мой файл Dockerfile:

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

и, похоже, работает. Но поскольку это спорадическая проблема, только время покажет...

Ответ 3

Использование источников FTP работает в 100% случаев.

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