018-Dockerfile-SHELL

语法

SHELL ["executable", "parameters"]

作用 & 描述

SHELL 指令允许覆盖用于 shell 形式命令的默认 shell。Linux 上的默认 shell 是 ["/bin/sh", “-c”],在 Windows 上是 [“cmd”, “/S”, “/C”]。SHELL 指令必须以 JSON 格式写入 Dockerfile。

SHELL 指令在 Windows 上特别有用,其中有两个常用且完全不同的本机 shell: cmd 和 powershell,以及包括 sh 的备用 shell。

SHELL 指令可以多次出现。每个 SHELL 指令都会覆盖所有先前 SHELL 指令,并影响所有后续指令。例如:

FROM microsoft/windowsservercore

# Executed as cmd /S /C echo default
RUN echo default

# Executed as cmd /S /C powershell -command Write-Host default
RUN powershell -command Write-Host default

# Executed as powershell -command Write-Host hello
SHELL ["powershell", "-command"]
RUN Write-Host hello

# Executed as cmd /S /C echo hello
SHELL ["cmd", "/S", "/C"]
RUN echo hello

当在 Dockerfile 中使用它们的shell形式时,SHELL 指令可能会影响以下指令:RUN,CMD 和 ENTRYPOINT。

以下示例时在 Windows 上找到的常见模式,可以使用 SHELL 指令简化:

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

docker 调用的命令将是:

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

由于两个原因,这是低效的。首先,调用一个不必要的 cmd.exe 命令处理器(也就是shell)。其次,shell 形式的每个 RUN 指令都需要一个额外的 powershell -command 前缀命令。
为了提高效率,可以采用两种机制中的一种。一种是使用 RUN 命令的 JSON 形式,例如:

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

虽然 JSON 表单是明确的,并且不使用不必要的 cmd.exe,但它确实需要通过双引号和转义更加详细。替代机制是使用 SHELL 指令和 shell 表单,为 Windows 用户提供更自然的语法,特别是与 escape parser 指令结合使用时:

# escape=`

FROM microsoft/nanoserver
SHELL ["powershell","-command"]
RUN New-Item -ItemType Directory C:\Example
ADD Execute-MyCmdlet.ps1 c:\example\
RUN c:\example\Execute-MyCmdlet -sample 'hello world'

导致:

PS E:\docker\build\shell> docker build -t shell .
Sending build context to Docker daemon 4.096 kB
Step 1/5 : FROM microsoft/nanoserver
 ---> 22738ff49c6d
Step 2/5 : SHELL powershell -command
 ---> Running in 6fcdb6855ae2
 ---> 6331462d4300
Removing intermediate container 6fcdb6855ae2
Step 3/5 : RUN New-Item -ItemType Directory C:\Example
 ---> Running in d0eef8386e97


    Directory: C:\


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       10/28/2016  11:26 AM                Example


 ---> 3f2fbf1395d9
Removing intermediate container d0eef8386e97
Step 4/5 : ADD Execute-MyCmdlet.ps1 c:\example\
 ---> a955b2621c31
Removing intermediate container b825593d39fc
Step 5/5 : RUN c:\example\Execute-MyCmdlet 'hello world'
 ---> Running in be6d8e63fe75
hello world
 ---> 8e559e9bf424
Removing intermediate container be6d8e63fe75
Successfully built 8e559e9bf424
PS E:\docker\build\shell>

SHELL 指令也可用于修改 shell 的运行方式。例如,在 Windows 上使用 SHELL cmd /S/C/V: ON|OFF,可以修改延迟的环境变量扩展寓意。

如果需要备用 shell,例如 zsh, csh, tcsh 等,也可以在 Linux 上使用 SHELL 指令。

在 Docker 1.12 中添加了 SHELL 功能。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值