Не удается установить build-essential внутри контейнера Docker.

Вопрос или проблема

Я получаю следующую ошибку:

3.033 Err:32 http://security.ubuntu.com/ubuntu noble-updates/main amd64 linux-libc-dev amd64 6.8.0-51.52
3.034   404  Not Found [IP: 91.189.91.82 80]

попытавшись выполнить следующую команду внутри контейнера Docker:

FROM ubuntu:24.04

RUN apt update
RUN apt upgrade

RUN apt -y install build-essential

Это проблема, связанная с DNS?

/etc/resolv.conf в контейнере Docker:

# Generated by Docker Engine.
# This file can be edited; Docker Engine will not make further changes once it
# has been modified.

nameserver 172.236.0.51
nameserver 172.236.0.54
nameserver 172.236.0.48
nameserver 172.236.0.46
nameserver 172.236.0.50
nameserver 172.236.0.47
nameserver 172.236.0.53
nameserver 172.236.0.52
nameserver 172.236.0.45
nameserver 172.236.0.49
search members.linode.com ip.linodeusercontent.com

# Based on host file: '/run/systemd/resolve/resolv.conf' (legacy)
# Overrides: []

отличается от /etc/resolv.conf на моей хостовой машине (Ubuntu 24.04):

ll /etc/resolv.conf
lrwxrwxrwx 1 root root 37 Jan 23 18:19 /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf
cat /etc/resolv.conf

nameserver 127.0.0.53
options edns0 trust-ad
search members.linode.com ip.linodeusercontent.com

но совпадает с /run/systemd/resolve/resolv.conf на хостовой машине.

Я не понимаю, почему у меня на хостовой машине два разных resonv.conf.

Также непонятно, настроен ли DNS внутри контейнера Docker правильно или нет.

EDIT1

Маршруты в контейнере Docker:

ip route show
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.3

Маршруты на хостовой машине:

ip route show
default via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-7c0ebcfd4e3a proto kernel scope link src 172.18.0.1
172.20.0.0/16 dev br-99d8bde8e488 proto kernel scope link src 172.20.0.1
172.236.0.45 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.46 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.47 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.48 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.49 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.50 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.51 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.52 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.53 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.0.54 via 172.236.29.1 dev eth0 proto dhcp src 172.236.29.157 metric 1024
172.236.29.0/24 dev eth0 proto kernel scope link src 172.236.29.157 metric 1024
172.236.29.1 dev eth0 proto dhcp scope link src 172.236.29.157 metric 1024

Из контейнера Docker:

ping 91.189.91.82
PING 91.189.91.82 (91.189.91.82) 56(84) bytes of data.
64 bytes from 91.189.91.82: icmp_seq=1 ttl=47 time=82.5 ms
64 bytes from 91.189.91.82: icmp_seq=2 ttl=47 time=82.6 ms

telnet security.ubuntu.com 80
Trying 91.189.91.81...
Connected to security.ubuntu.com.
Escape character is '^]'.
^]
telnet> quit
Connection closed.

EDIT2

Из контейнера Docker:

root@4e534b3b6847:/# apt install --no-cache linux-libc-dev
E: Command line option --no-cache is not understood in combination with the other options
root@4e534b3b6847:/# df -h
Filesystem      Size  Used Avail Use% Mounted on
overlay          49G   34G   15G  70% /
tmpfs            64M     0   64M   0% /dev
shm              64M     0   64M   0% /dev/shm
/dev/sda         49G   34G   15G  70% /etc/hosts
tmpfs           985M     0  985M   0% /proc/acpi
tmpfs           985M     0  985M   0% /proc/scsi
tmpfs           985M     0  985M   0% /sys/firmware

root@4e534b3b6847:/# apt clean
root@4e534b3b6847:/# apt install linux-libc-dev
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following NEW packages will be installed:
linux-libc-dev
0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded.
Need to get 1,769 kB of archives.
After this operation, 7,508 kB of additional disk space will be used.
Ign:1 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 linux-libc-dev amd64 6.8.0-51.52
Err:1 http://security.ubuntu.com/ubuntu noble-updates/main amd64 linux-libc-dev amd64 6.8.0-51.52
404  Not Found [IP: 185.125.190.82 80]
E: Failed to fetch http://security.ubuntu.com/ubuntu/pool/main/l/linux/linux-libc-dev_6.8.0-51.52_amd64.deb  404  Not Found [IP: 185.125.190.82 80]
E: Unable to fetch some archives, maybe run apt-get update or try with --fix-missing?

EDIT3

На хостовой машине:

  $ apt-cache policy linux-libc-dev
  linux-libc-dev:
  Installed: 6.8.0-52.53
  Candidate: 6.8.0-52.53
  Version table:
  *** 6.8.0-52.53 500
        500 http://mirrors.linode.com/ubuntu noble-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
        100 /var/lib/dpkg/status
     6.8.0-31.31 500
        500 http://mirrors.linode.com/ubuntu noble/main amd64 Packages

В контейнере Docker:

  # apt-cache policy linux-libc-dev
  linux-libc-dev:
  Installed: (none)
  Candidate: 6.8.0-51.52
  Version table:
     6.8.0-51.52 500
        500 http://archive.ubuntu.com/ubuntu noble-updates/main amd64 Packages
        500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
     6.8.0-31.31 500
        500 http://archive.ubuntu.com/ubuntu noble/main amd64 Packages

Когда я проверил репозиторий вчера, Packages.gz был датирован 2025-01-29, сегодня он датирован 2025-01-30 04:21.

Джеральд Шнайдер попал в точку! Вы стали жертвой обновления репозитория.

Ответ или решение

Конечно, давайте подробно разберем вопрос, связанный с невозможностью установки пакета build-essential внутри Docker-контейнера на основе Ubuntu 24.04. Проблема, с которой вы столкнулись, связана с ошибкой «404 Not Found» при попытке загрузки пакета из репозитория Ubuntu. Давайте шаг за шагом разберемся, что может вызывать эту ошибку и как ее исправить.

Теория

Ошибка «404 Not Found» в контексте пакетного менеджера APT обычно говорит о том, что запрашиваемый пакет или его версия недоступны в репозитории. Это может быть связано с несколькими причинами:

  1. Обновление репозиториев: Иногда, репозитории обновляются и пакеты перемещаются, удаляются или изменяются. Это может привести к тому, что ссылка на пакет устаревает.
  2. Некорректные записи в файле источников APT: Если APT использует неправильные репозитории или неточные пути, это может быть причиной такой ошибки.
  3. Кэширование данных APT: Возможна ситуация, когда кэшированные данные APT устарели и не соответствуют актуальному состоянию репозиториев.

В вашем случае, судя по ошибке, скорее всего, была проведена миграция или обновление в репозиториях Ubuntu, что привело к рассинхронизации версий пакетов и их фактической доступности.

Пример

Рассмотрим ваш Dockerfile и сценарий:

FROM ubuntu:24.04

RUN apt update
RUN apt upgrade

RUN apt -y install build-essential

На первый взгляд, здесь все корректно, но ошибка возникает при попытке установить build-essential, так как его зависимости, такие как linux-libc-dev, не могут быть найдены. Это показывает, что актуальная версия этого пакета 6.8.0-52.53, а ранее доступная 6.8.0-51.52 более недоступна.

Применение

Для решения вашей проблемы, следуйте следующим рекомендациям:

  1. Проверка и коррекция списка источников: Посмотрите содержимое файлов /etc/apt/sources.list и /etc/apt/sources.list.d/. Убедитесь, что ссылки в них актуальны и соответствуют последней версии дистрибутива. Это можно сделать с помощью команды:

    cat /etc/apt/sources.list

    И проверьте, корректно ли написаны URL-адреса репозиториев и есть ли они в актуальной документации Ubuntu.

  2. Обновление кэша списка пакетов: Иногда файлы кэшируются и становятся устаревшими. Используйте команду:

    apt update

    Это обновит список пакетов из доступных источников и даст возможность установить актуальные пакеты.

  3. Проверка конкретных версий пакетов: Используйте команду apt-cache policy <имя_пакета>, чтобы увидеть, какие версии пакетов доступны. Это поможет убедиться, что APT пытается загрузить пакет из правильного источника.

  4. Использование альтернативных зеркал: Если какая-то конкретная зависимость недоступна, возможно, стоит временно использовать другие официальные зеркала хранения пакетов. Измените /etc/apt/sources.list для временного переключения на другое зеркало:

    Например, переключитесь на другое зеркало, заменив "http://archive.ubuntu.com/ubuntu" на "http://mirrors.kernel.org/ubuntu".

  5. Проверка DNS конфигурации: DNS проблемы могли вызвать ошибки, но в вашем случае, как показано, IP-адреса резолвятся корректно:

    ping 91.189.91.82
    telnet security.ubuntu.com 80

    Приведенные вами командные выводы показывают успешное соединение, что указывает на то, что причина не в DNS.

  6. Проблемы с версиями: Иногда вы можете столкнуться с проблемой рассинхронизации версий пакетов. Убедитесь в том, что используемые версии совпадают с актуальными версиями в репозиториях.

Следуя этим шагам, вы должны быть в состоянии устранить ошибку и успешно установить build-essential и его зависимости. Если проблема продолжает возникать, возможно, стоит обратиться к документации или сообществу Ubuntu для получения более конкретной информации о состоянии репозиториев и доступных зеркал.

Оцените материал
Добавить комментарий

Капча загружается...