我有一个基于 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
为 )。