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

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)