0 前言
运行命令的形式有两种:Shell格式和Exec格式运行命令
RUN两种都可以
CMD和ENTRYPOINT推荐使用Exec
Shell格式:<instruction> <command>。例如:apt-get install python3
Exec格式:<instruction> ["executable", "param1", "param2", ...]。例如: ["apt-get", "install", "python3"]
1 RUN
RUN指令允许您安装应用程序和程序包。它在当前镜像之上执行任何命令,并通过提交结果来创建新层。通常,您会在Dockerfile中找到多个RUN指令。
RUN apt-get update && apt-get install -y \
bzr \
cvs \
git \
mercurial \
subversion
注意:apt-get update和apt-get install在单个RUN指令中执行。这样做是为了确保安装最新的软件包。如果apt-get install位于分开的RUN指令中,那么它将重用apt-get update添加的层,这可能是很久以前创建的。建议多个指令用&&隔开在一个run中执行。
2 CMD
CMD指令允许您设置默认命令,该命令仅在您运行容器不指定命令时候运行。如果Docker容器使用命令运行,则将忽略默认命令。如果Dockerfile具有多个CMD指令,则忽略除最后一个CMD指令之外的所有指令。
如:
dockerfile中有如下语句
CMD echo "Hello world"
容器运行时docker run -it
出现Hello world
但是,运行时如果增加了其他指令,如docker run -it /bin/bash,那么CMD执行 /bin/bash命令,则不会输出
3 ENTRYPOINT
ENTRYPOINT指令允许您配置将作为可执行文件运行的容器。它看起来类似于CMD,因为它还允许您使用参数指定命令。区别在于当Docker容器使用命令行参数运行时,ENTRYPOINT命令不会忽略参数。
ENTRYPOINT 中的参数始终会被使用,而 CMD 的额外参数可以在容器启动时动态替换掉。
如:
dockerfile中有:
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]
ENTRYPOINT和CMD同时存在时, docker把CMD的命令拼接到ENTRYPOINT命令之后, 拼接后的命令才是最终执行的命令。
当容器运行docker run -it 时将输出 hello world
但是,如果容器运行带参数,如docker run -it John时,将输出hello john