Всем привет! Недавно начал осваивать 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), но проверять это у меня нет никакого желания. Возможно, это кому-то поможет