Docker和DevOps:5.Dockerfile语法中的RUN、CMD、ENTRYPOINT

186 阅读1分钟

Dockerfile语法中的RUN、CMD、ENTRYPOINT

一、三个命令的总览

  • RUN: 在基于FROM指定的Base Image创建临时Container(容器)后,执行RUN指定的命令,并创建一层新的Image Layer(镜像层)。
  • CMD: 设置容器启动后默认执行的命令和参数。
  • ENTRYPOINT: 设置容器启动时运行的命令。

二、Shell格式和Exec格式

1.Shell格式

直接将shell命令放在关键字之后,例如:

RUN apt-get install -y vim
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
2.Exec格式

使用固定格式指明要运行的命令,及命令的参数。

RUN["apt-get","install","-y","vim"]
CMD["/bin/echo","hello docker"]
ENTRYPOINT["/bin/echo","hello docker"]
3.Exec格式能不能取到EVN关键字定义的变量?
  • Shell格式的dockerfile
FROM ubuntu
EVN name Docker
ENTRYPOINT echo "hello $name"

构建出镜像后,docker run创建容器启动后,会打印出“hello Docker”

  • Exec格式的dockerfile
FROM ubuntu
EVN name Docker
ENTRYPOINT ["/bin/echo","hello $name"]

构建出镜像后,docker run创建容器启动后,会打印出“hello $name”

-为什么Exec格式取不到EVN定义的变量呢?因为Shell格式是使用bash shell执行RUN后面的命令,而bash shell中能识别$标识的变量;而Exec是直接执行[""]中的首位内容,即直接执行/bin/echo,识别不到变量。

  • 修改一下:
FROM ubuntu
EVN name Docker
ENTRYPOINT ["/bin/bash","-c","echo hello $name"]

三、关键字:CMD

  • 容器启动(docker run)时默认执行的命令。
  • 如果容器启动时指定了其他命令,如docker run -it image,则CMD命令将被忽略。
  • 如果定义了多个CMD,只有最后一个会执行。
FROM ubuntu
EVN name Docker
ENTRYPOINT echo "hello $name"

当使用docker run image时会输出:hello Docker
当使用docker run -it image时会输出:无输出,CMD关键字被忽略。


四、关键字:ENTRYPOINT

  • 让容器以应用程序或服务的形式运行
  • 不会被忽略,一定会被执行