gpt4 book ai didi

shell - Docker 如何在不调用命令 shell 的情况下运行命令?

转载 作者:行者123 更新时间:2023-12-04 22:56:52 25 4
gpt4 key购买 nike

我目前正在学习 Docker,并浏览了 Dockerfile reference ,特别是 RUN 操作说明。 有两种形式RUN - 在 shell 中运行命令的 shell 形式和“不调用命令 shell”的 exec 形式(引自注释部分)。

如果我正确理解文档,我的问题是 - 如果,以及如何,Docker 在没有 shell 的情况下运行命令?

Note that the answers to Can a command be executed without a shell?'s don't actually answer the question.

最佳答案

如果我正确理解您的问题,您会问如何在不调用命令 shell 的情况下运行某些内容(特别是在 docker 的上下文中)。

在 linux 内核中运行的方式通常使用 the exec family of system calls.

例如,您将要运行的可执行文件的路径以及需要通过 execl 调用传递给它的参数传递给它。

无论如何,这实际上是您的 shell 程序(sh、bash、ksh、zsh)在幕后所做的事情。如果你运行类似 strace -f bash -c "cat /tmp/foo" 的东西,你可以自己观察这一点。

在该命令的输出中,您将看到如下内容:

execve("/bin/cat", ["cat", "/tmp/foo"], [/* 66 vars */]) = 0

真正发生的事情是 bash 查找 cat$PATH ,然后发现 cat实际上是 /bin/cat 处可用的可执行二进制文件.然后它通过 execve 简单地调用它.以及您在上面看到的正确参数。

您也可以轻松编写一个执行相同操作的 C 程序。
这是这样一个程序的样子:
#include<unistd.h>

int main() {

execl("/bin/cat", "/bin/cat", "/tmp/foo", (char *)NULL);

return 0;
}

每种语言都提供了与这些系统调用交互的方式。 C 可以,Python 可以,Go 也可以,大多数情况下用于编写 Docker 的 Go 也可以。 A RUN docker 中的指令可能会转换为其中之一 exec当您点击时调用 docker build .您可以运行 strace -f docker build然后 grepexec调用日志以查看魔法是如何发生的。

通过 shell 和直接运行某些东西之间的唯一区别是,你会失去 shell 将为你做的所有花哨的事情,比如变量扩展、可执行文件搜索等。

关于shell - Docker 如何在不调用命令 shell 的情况下运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42257450/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com