Dockerfile CMD指令 语法解析

  Docker通过dockerfile创建镜像时,RUNCMD是相当重要的命令,本文对这CMD指令进行解析。

  CMD 语法

# exec形式,这是首选形式.
CMD ["executable","param1","param2"]
# 提供给ENTRYPOINT的默认参数.
CMD ["param1","param2"]
# shell形式.
CMD command param1 param2

  CMD 语义

  · dockerfile中只能包含一个CMD指令,如果存在多个,只有最后一个CMD生效。

  · CMD的主要用途是为执行容器提供默认值。这些默认值可以包括可执行文件,或者也可以省略可执行文件,但在这种情况下,必须指定一个ENTRYPOINT

  · 如果CMD被用来为ENTRYPOINT指令提供默认参数,那么CMDENTRYPOINT指令必须使用JSON Array格式。

  · exec 形式是按照JSON Array格式解析,意味着必须是使用双引号(")包含参数,而不能使用单引号(’)。

  ·shell形式不同,exec形式不会调用shell命令行,意味着不会进行shell处理。例如:运行RUN [ "echo", "$HOME" ]不会对$HOME进行变量替换。如果需要shell处理,那么可以使用shell形式或直接执行shell,例如:RUN["sh","-c","echo $HOME"]。当使用exec形式直接执行shell时,与shell形式类似,应用的shell是宿主机而非Docker。

  · 当使用shellexec形式时,通过CMD设置的指令在镜像运行时执行。

  · 如果使用CMDshell形式,那么使用/bin/bash -c执行:

FROM ubuntu
CMD echo "This is a test." | wc -

  · 如果不想使用shell执行命令,那么必须以JSON Array格式指定命令表达式,同时指定可执行文件的完整路径。这里的JSON Array格式即是CMD的首选格式。任何附加参数都必须被定义为数组中的字符串。

FROM ubuntu
CMD ["/usr/bin/wc","--help"]

  · 如果希望容器每次都执行相同的可执行文件,可以考虑使用ENTRYPOINTCMD结合使用。

  · docker run指定的参数会覆盖CMD指定的值。

  · 不要混淆RUNCMDRUN用来运行一个命令并提交结果,目的是进行镜像构建;CMD在构建时不执行任何操作,而是在容器运行时运行指定的命令。

  CMD 示例

  1) 进入/securitit/dockerfile/目录(根据个人选择,这是本文使用的目录),创建dockerfile文件。

FROM nginx
MAINTAINER Securitit
CMD echo "The container is running, You can use it now!"

  2) 执行如下的构建命令,基于dockerfile构建镜像。

docker build -f /securitit/dockerfile/dockerfile -t securitit-nginx-cmd:1.0.0.1 .

在这里插入图片描述

  3) 查看镜像信息。

docker images

在这里插入图片描述

  4) 指定通过dockerfile生成的镜像启动容器。

docker run --name securitit-nginx-cmd -it -p 10180:80 securitit-nginx-cmd:1.0.0.1

在这里插入图片描述

  5) 可以看到,dockerfile中定义的CMD指令内容会在docker run运行容器时执行。

  CMD 与 RUN

  CMDRUN都是用来在dockerfile中配置命令的,它们之间有所不同:

  · 应用阶段

   RUN是镜像构建步骤,RUN命令后将容器的状态提交到容器镜像。

   CMD是启动构建镜像时,默认情况下,容器执行的命令。

  · 执行次数

   一个dockerfile可以具有很多RUN步骤,这些步骤相互叠加最后生成镜像。

   dockerfile将使用最后一个CMD指令,使用CMD启动容器时可以覆盖docker run $image $other_command

  总结

  RUNCMD指令在基于dockerfile构建镜像时,起到了非常大的作用,各位可以按照文中示例,手动操作一遍。

​  docker build系列指令会在今后的博客中更新。

  若文中存在错误和不足,欢迎指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值