在Dockerfile中,RUN指令有两种形式shell
和exec
:
# shell form
RUN <command>
# exec form
RUN ["executable", "param1", "param2"]
当使用shell形式时,<command>
在shell中运行,在它前面加上一个合适的shell(即:sh -c "<command>"
)。
到目前为止这么好,问题是:exec如何形成工作?如何在没有shell的情况下执行命令我没有找到令人满意的答案阅读官方文件。
答案 0 :(得分:1)
该命令的exec形式使用与Docker用来运行shell本身相同的OS系统调用来运行您的命令。它正在执行linux用来运行任何进程的fork / exec的命名空间版本。 shell本身是一种便利,提供PATH处理,可变扩展,IO重定向和其他脚本功能,但在操作系统级别运行进程并不需要这些功能。 This question可以帮助您了解Linux如何运行流程。
答案 1 :(得分:0)
这看起来像一个泊坞文件。
使用RUN语法,命令将在para虚拟化环境中一次运行一个命令,并且将为每个命令生成给定环境(通常为Bash)的默认shell。 sh -c是&#34;简写&#34;因为bash所以你实际上在做同样的事情。
答案 2 :(得分:0)
在shell形式中,该命令将在/ bin / sh -c
的shell中运行RUN apt-get update
Exec格式允许在没有/ bin / sh
的图像中执行命令RUN [“apt-get”, “update”]
shell表单更容易编写,您可以执行变量的shell解析 •例如
CMD sudo -u $(USER} java ....
•Exec表单不需要图像有shell。