Всем привет! Недавно начал осваивать Docker. Руководствуясь документацией создал образ с Astra Linux. Далее, раскомментировав репозитории в sources.list
, начал через apt
накатывать пакеты: делал это в оболочке внутри контейнера через docker run -it astralinux:latest /bin/bash
, а потом выходил и коммитил при помощи docker commit <id контейнера> <нужное мне название>
.
Вчера при попытке накатить туда git столкнулся с ошибкой:
dpkg: ошибка при обработке архива /var/cache/apt/archives/perl-base_5.28.1-6+deb10u1+ci202305241311+astra2+b2_amd64.deb (--unpack):
не удалось создать резервную ссылку на «./usr/bin/perl» перед установкой новой версии: Отказано в доступе
dpkg-deb: ошибка: вставка subprocess was killed by signal (Обрыв канала)
При обработке следующих пакетов произошли ошибки:
/var/cache/apt/archives/perl-base_5.28.1-6+deb10u1+ci202305241311+astra2+b2_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)
Что пытался делать для решения:
-
Интернет говорил пробовать запускать apt через sudo, но в ответ мне выдавало
bash: sudo: команда не найдена
. Установка sudo через apt проблему не решила: выдавало всё туже же dpkg ошибку. -
Также пробовал через
setfacl
давать пользователю _apt права на чтение и выполнение для директорий/var/cache/apt/archives/
и/usr/bin/perl
, что результата также не дало:
setfacl -R -m u:_apt:rx <пути, о которых я писал выше>
- Команда
dpkg --configure -a
также не дала результата
До этого я уже сталкивался с данной проблемой, но она пропадала как-то сама. Что для этого потребовалось - я так и не понял.
Поитогу решить вопрос всё-таки удалось. Проблема исчезла, как только я взял изначальный образ, на основе которого создавал все контейнеры.
Могут знающие люди подсказать, из-за чего описанная мною проблема возникает, и какие есть методы её решения?
UPD: Столкнулся с той же проблемой, когда собирал образ с pvs-studio через докерфайл.Через apt-get
накатил wget
, make
и ca-certificates
, а потом потёр всё через purge
и… Короче, проще фрагмент файла кинуть (sed
в начале - это я раскомменчиваю репозитории с нужными пакетами):
RUN sed '7 s/#//' /etc/apt/sources.list -i && \
apt-get update -q && \
apt-get -yq install make g++ wget ca-certificates --no-install-recommends && \
...
apt-get purge -qy wget ca-certificates && \
apt-get autoremove -y && \
apt-get clean && \
rm /etc/apt/sources.list.d/viva64.list && \
rm -rf /var/lib/lists
Потом следующим RUN-ом пытался накатить g++
для cmake (сверху уже итоговый докерфайл, в котором я ставлю g++ вначале). Ключевое слово, как вы понимаете «пытался». Вылезла та же ошибка, но в этот раз он ругался на libc6
, который apt
пометил для обновления. На основании этого всего я предположил, что корень проблемы лежит в зависимостях между пакетами: возможно система не даёт трогать либс потому что на нём много завязано. А без этого обновления g++
поставить не получилось (невозможность установки g++ после apt-mark
на libc явно дала это понять). apt
с флагами -f
и --no-upgrade
результатов не дали.
Возможно решение кроется в установке всех зависимых пакетов по-одному вручную (через apt download
и apt install *.deb
), но проверять это у меня нет никакого желания. Возможно, это кому-то поможет