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指令多用于Windows系统的镜像中,因为Windows有两个常用但差异巨大的Shells,一个是默认的cmd,另一个是powershell。修改默认Shell如下:
SHELL ["powershell", "-command"]
而在 Linux系统的镜像中,如果要使用其他Shell时,如tcsh, csh, zsh等,也可以设置SHELL指令,如:
在一个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/
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/
相关文章推荐
- Dockerfile中的ENTRYPOINT和CMD指令详解与比较
- 详解docker中Dockerfile指令创建镜像
- Dockerfile 指令详解
- Dockerfile中的ARG指令详解
- Dockerfile基本语法结构和指令用法详解
- Dockerfile指令详解下
- Dockerfile 指令详解
- Dockerfile中的ARG指令详解
- Dockerfile文件中CMD和ENTRYPOINT指令差异对比
- Dockerfile指令详解
- Dockerfile中的ENV指令详解
- Dockerfile指令详解上
- Dockerfile文件中的CMD和ENTRYPOINT指令差异对比
- Dockerfile指令总结
- docker学习笔记16:Dockerfile 指令 ADD 和 COPY介绍
- docker学习笔记13:Dockerfile 指令 WORKDIR介绍
- Dockerfile创建自定义Docker镜像以及CMD与ENTRYPOINT指令的比较
- docker学习笔记17:Dockerfile 指令 ONBUILD介绍
- Docker Dockerfile详解
- DockerFile 参数详解