2016-06-20 9 views
0

開発者マシンからサーバーにソフトウェアプロジェクト(rpmとしてパッケージ化)を展開する必要があります。私はFedora 23とdnfパッケージマネージャを使用しています。サーバーにデプロイする前に、rpmのすべての依存関係を収集する必要があります。内部の規制のためにサーバをインターネットに接続することはできません(しかし、私はそれをsshすることができます)。実行中のリポジトリミラーなどはオプションではありません。私は、デベロッパーマシン上のすべての依存関係をscp(またはansible)でサーバーに収集し、サーバーにインストールする必要があるのではないかと心配しています。すべてのrpm依存関係を収集してプロジェクトを展開する

--installroot dnfのオプションは、dnfが空のシステムだと思うものにインストールされるすべてのrpmsを取得できるので大いに役立つことを望みました。しかし、これは動作しません。

mkdir foo && sudo dnf install --installroot=$PWD/foo golang

エラーを与える:

Failed to synchronize cache for repo 'fedora'

これはなぜ失敗するのか?私の選択肢は何ですか?

私は、エレガントで堅牢なソリューションをご希望です。私はサーバーに何もインストールしないことを望んでいます(私は、1つのscpの後にsshを介して1つまたは2つのコマンドを実行するのが最も嬉しいです)。 rpm + yum/dnfの魔法の組み合わせは素晴らしいでしょうが、apt + debを含む他の解決策も興味深いです。私はドッカーを使用しないことを望んでおり、追加のインフラストラクチャ(ドッカーレジストリ、rpmミラーなど)を実行することに強く反対しています。

+0

これまではこのような制限がありましたが、必要な回避策でソフトウェアをインストールするのが最も安全な方法であると結論づけました。署名済みのパッケージリポジトリを有効にする方がずっと良いでしょう。インストールされているパッケージが気になる場合は、リポジトリの内容を制御します。このようなことがなければ、必要なRPMをすべてコピーして、一度に1つずつインストールするように強制されました。最後に、Dockerコンテナの使用を検討することもできます.Dockerコンテナは、オフラインで作成し、署名してから展開レジストリにプッシュすることができます。根本的な考えにはほど遠いでしょう。望みは助けてくれる –

+0

@ MarkO'Connorなぜinstall-rootスイッチが動かないのですか?これは、すべてのパッケージを収集する最もクリーンな方法のように思えます。 –

+0

"golang"と呼ばれるパッケージの前提条件がすべてインストールされたchrootが必要ですか? Poky-YoctoはRPM5を "solvedb"(これは "everything"のrpmdb以上のもの)と一緒に使用します。 solvedb(マクロで設定)を指定すると、 "rpm -Uvh --root = $ PWD/foo + golang"を実行すると、golangとその前提条件がすべて$ PWD/fooのchrootにインストールされます。詳細を追加することはできますが、事前に注意してください。操作はパッケージに含まれるメタデータと同じくらい良いものです。 –

答えて

1

ここでは、(アドホックで軽くテストされた)指定されたパッケージをインストールするのに必要なすべてのrpmパッケージ名のリストを生成します(このスクリプトはgoal = "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 
+0

興味深い。私は今夜​​それを試してみましょう。 –

+0

ありがとう@JeffJohnson、これは動作するようです。私はちょっと驚いたことに、「hello world」のWebサイトには依存関係が150MBの重み付けされていることに驚いていますが、なぜそれがあるのか​​理解しています。 sed、awk、grepなど明確に冗長なものです。いずれにしても、コードを少し変更して、[github](https://github.com/picrin/rpmDownloader)(属性付き)に配置しました。ダウンロードしたRPMがWebサイトの実行に十分な機能を提供するかどうかを確認する必要があります。 –

+0

あなたはおそらくi686とx86_64の両方のパッケージを必要としませんが、あなたのマニフェストは正しいと思われます。 –

関連する問題