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
- 让容器以应用程序或服务的形式运行
- 不会被忽略,一定会被执行