您的位置:首页 > 运维架构 > Docker

Dockerfile中的Shell风格与JSON风格对比及SHELL指令详解

2017-06-15 23:15 811 查看
1. 在Dockerfile中,有些指令(如RUN,ENTRYPOINT和CMD指令)的定义,可以采用Shell格式,也可以采用JSON格式。

1) 采用Shell格式定义,示例如下:

CMD top -b

上述CMD指令,在采用默认SHELL的情况下,实际执行“/bin/sh -c top -b”。
2) 采用JSON格式定义,示例如下:

CMD ["top", "-b"]

上述CMD指令,不受默认SHELL的影响,实际执行“top -b”。

2. Dockerfile中的SHELL指令

Dockerfile中的SHELL指令用以设置Shell风格下使用的Shell的特性,覆盖默认特性。Shell风格的改变将会影响到所有使用该风格定义的Dockerfile指令,主要是RUN,ENTRYPOINT和CMD。用法如下:

SHELL ["executable", "parameters"]

在Linux系统的镜像中,默认SHELL指令如下:
SHELL ["/bin/sh", "-c"]

在Windows系统的镜像中,默认SHELL指令如下:
SHELL ["cmd", "/S", "/C"]


SHELL指令多用于Windows系统的镜像中,因为Windows有两个常用但差异巨大的Shells,一个是默认的cmd,另一个是powershell。修改默认Shell如下:
SHELL ["powershell", "-command"]

而在 Linux系统的镜像中,如果要使用其他Shell时,如tcsh, csh, zsh等,也可以设置SHELL指令,如:
SHELL ["/bin/tcsh", "-c"]


在一个Dockerfile文件中可以出现多个SHELL指令,后者继承前者的设置。

3.Windows镜像示例

由于Windows系统的镜像中,默认SHELL指令为SHELL ["cmd", "/S"", "/C"]

所以:

RUN powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"

默认等价于

cmd /S /C powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"

RUN ["powershell", "-command", "Execute-MyCmdlet", "-param1 \"c:\\foo.txt\""]

才默认等价于

powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"

只有在重新定义SHELL如下:

SHELL ["powershell", "-command"]

RUN Execute-MyCmdlet -param1 "c:\foo.txt"

才等价于

powershell -command Execute-MyCmdlet -param1 "c:\foo.txt"

参考链接:
https://docs.docker.com/engine/reference/builder/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  docker Dockerfile shell JSON