В 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
Ответы
Ответ 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