Соберите все зависимости rpm для развертывания проекта
Мне нужно развернуть программный проект (упакованный как rpm) с компьютера разработчика на сервер. Я использую Fedora 23 вместе с менеджером пакетов dnf. Я должен собрать все зависимости моего rpm перед развертыванием на сервере. Сервер не может быть подключен к Интернету из-за внутренних правил (но я могу подключиться к нему по ssh). Запуск зеркал репозитория и т. Д. Не вариант. Боюсь, мне просто нужно собрать все зависимости на компьютере разработчика, скопировать (или ответить) их на сервер и установить на сервере.
Я надеялся что --installroot
опция в dnf может быть очень полезна, так как я могу получить все rpms, которые будут установлены в то, что dnf считает пустой системой. Это, однако, не работает.
mkdir foo && sudo dnf install --installroot=$PWD/foo golang
выдает ошибку:
Failed to synchronize cache for repo 'fedora'
Почему это не удается? Какие у меня варианты?
Я хотел бы видеть элегантное и надежное решение. Я бы предпочел не устанавливать что-либо на сервер (я был бы очень рад сделать один scp, а затем одну или две команды через ssh). Было бы неплохо сочетание магии rpm + yum / dnf, но интерес представляют и другие решения, в том числе apt + deb. Я бы предпочел не использовать docker, и я категорически против запуска какой-либо дополнительной инфраструктуры (реестра Docker, зеркала rpm и т. Д.)
1 ответ
Вот скрипт (ad hoc, слегка протестированный) (при условии, что у вас уже установлена система rpm) для генерации списка всех имен пакетов rpm, необходимых для установки данного пакета (скрипт предполагает target ="bash", отредактируйте по вкусу).
Подайте выходные имена в dnf/yum для установки.
#!/bin/sh
goal=bash
deps=$(rpm -q --qf '[%{REQUIRENAME}\n]' $goal | egrep -v '^(rpmlib|rtld|config|/)')
goals=
while true; do
subs=$(rpm -q --qf '%{NAME}\n' --whatprovides $deps | sort -u | tr '\n' ' ')
if [ ."$subs" = ."$goals" ]; then
echo "--- packages needed"
echo "$goals" | tr ' ' '\n'
exit 0
fi
goals=$(echo $goals $subs | tr ' ' '\n' | sort -u | tr '\n' ' ')
for sub in $subs; do
subdeps=$(rpm -q --qf '[%{REQUIRENAME}\n]' $sub | egrep -v '^(rpmlib|rtld|config|/)')
deps=$(echo $deps $subdeps | sort -u)
done
done