UbuntuベースのDockerfileがありますが、最小限のDebianまたはAlpineベースに変更したいと思います。問題は、プリインストールされた複数のシステム実行ファイルに依存していますが、どの実行ファイルを使用しているのかわからないことです。 Alpineベースの新しいDockerfuleを作成するには、まずどのプログラムが使用されているかを調べてから、Alpineがそのプログラムを提供するパッケージ名を調べる必要があります。 Dockerコンテナが使用するシステム実行可能ファイルを簡単に記録する簡単な方法はありますか? PATHのすべてのエントリを新しいディレクトリに移動し、プロキシとして機能するbashスクリプトを作成し、実行可能ファイル名を記録してから、実際の実行可能ファイルを呼び出そうとします。しかし、これは安全で信頼できることでしょうか?
答え1
ftraceを使用してこれを実行し、execへの各呼び出しを記録できます。 Ubuntuからユーティリティをダウンロードできますtrace-cmd
。
apt install trace-cmd
次に、execイベントを見つけます。 (必要があります。機能しないことをsched_process_exec
確認してください。)trace-cmd list | grep exec
root権限で実行する必要があります。
sudo trace-cmd record -e "sched_process_exec" your_program
trace-cmd report #to read the generated output
呼び出されたすべての実行可能ファイルを表示するスクリプトをテストしました。追加情報が必要な場合は、同じ方法を使用してより多くのイベントを追跡できます(監視可能なすべてのイベントが再表示されますtrace-cmd list
)。
より良い方法で実行可能ファイルを表示するには、結果をgrepして一意の値を取得できます(これが出力に適していることを確認してください。私のバージョンが少し古いかもしれません)。
trace-cmd report | grep -Eo "filename=[^ ]+" | sort | uniq
ノート マニュアルによると:
The trace-cmd(1) record command will set up the Ftrace Linux kernel tracer to record the specified plugins or events that happen while the command executes.
If no command is given, then it will record until the user hits Ctrl-C.
トレーサーは、プログラムの実行中にキャプチャーされたすべてのイベントを表示します。つまり、呼び出しプロセスに関係なく、すべてのプロセス実行が記録されます。誤った肯定を避けるために、この作業を実行するときにシステムをできるだけ軽くしてください。呼び出すプロセスの場合(再帰的に)、基本プロセスが終了した場合、またはその間に奇妙なことが発生しない限り(実際には発生しなくても)安全を維持する必要があります。
答え2
まず、どのプログラムが使用されているかを調べる必要があります
プロセスアカウントを有効にできます。 Debian でのパッケージはacct
。
apt install acct # Install the package
accton on # Enable accounting to /var/log/account/pacct
その後、実行されたコマンドを表示できます。
lastcomm # All commands
lastcomm -u userid # Processes executed by {userid}
通常どおりaccton
参照lastcomm
文書があります(man accton
それぞれman lastcomm
)。