作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前正在学习 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
cat
在
$PATH
,然后发现
cat
实际上是
/bin/cat
处可用的可执行二进制文件.然后它通过
execve
简单地调用它.以及您在上面看到的正确参数。
#include<unistd.h>
int main() {
execl("/bin/cat", "/bin/cat", "/tmp/foo", (char *)NULL);
return 0;
}
RUN
docker 中的指令可能会转换为其中之一
exec
当您点击时调用
docker build
.您可以运行
strace -f docker build
然后
grep
为
exec
调用日志以查看魔法是如何发生的。
关于shell - Docker 如何在不调用命令 shell 的情况下运行命令?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42257450/
我是一名优秀的程序员,十分优秀!