Dockerfile中Shell和Exec格式指令的区别

64

什么是shellexec形式在CMD中的区别:

CMD python my_script.py arg

对决。

CMD ["python", "my_script.py", "arg"]

ENTRYPOINT:

入口点:
ENTRYPOINT ./bin/main

对比。

ENTRYPOINT ["./bin/main"]

并且RUN

RUN npm start

对决。

RUN ["npm", "start"]

Dockerfile 指令?


2
这回答了你的问题吗?什么是shell form和exec form? - fgul
2个回答

71
Shell形式与Exec形式有两个不同点。根据文档,Exec形式是首选形式。以下是这两个不同点:

Exec形式被解析为JSON数组,这意味着必须使用双引号(“)而不是单引号(‘)来引用。

与Shell形式不同,Exec形式不会调用命令Shell。这意味着不会发生正常的Shell处理。例如,CMD ["echo", "$HOME"]将不会对$HOME进行变量替换。如果要进行Shell处理,则可以使用Shell形式或直接执行Shell,例如:CMD ["sh", "-c", "echo $HOME"]。在使用Exec形式并直接执行Shell时,与Shell形式一样,进行环境变量扩展的是Shell而不是Docker。

还有一些额外的细微差别:

使用Exec形式可以避免Shell字符串替换,并使用不包含指定的Shell可执行文件的基础映像运行命令。

在Shell形式中,可以使用\(反斜杠)将单个RUN指令延续到下一行。

CMD还有第三种形式:

CMD ["param1", "param2"](作为ENTRYPOINT的默认参数)

此外,如果要将它作为要覆盖的ENTRYPOINT参数/参数使用,则需要Exec形式。


36
我想指出,如果在ENTRYPOINT中使用shell形式,很可能意味着您没有正确地传递信号给应用程序,这可能会导致问题,尤其是在Kubernetes集群中。 - rln
10
这条评论比答案更重要,因为答案只是重复了文档。 - 4c74356b41
4
仅仅复制粘贴文件说明而没有进一步解释是没有用的! - Shaaer
3
“shell string munging”在文档中是什么意思? - Rnj
1
@Rnj我认为它的意思是Shell扩展。 “变量替换”部分描述了它。 - krave

3

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接