目录
Dockerfile面试题
CMD、ENTRYPOINT与RUN命令对比
(一)CMD命令
(二)RUN命令
(三)ENTRYPOINT
(四)RUN和CMD、ENTRYPOINT支持参数形式命令 :
Dockerfile面试题
CMD、ENTRYPOINT与RUN命令对比
(一)CMD命令
是在容器启动后执行的命令,一个Dockerfile可以有多个CMD,但是只有最后一个CMD生效。当容器启动时如果指定了命令,那么CMD的命令将被忽略。
例:
下载alpine镜像
docker pull alpine
1、建立工作目录
2、编写Dockerfile文件
配置如下:
FROM alpine:latest
WORKDIR /workdir
ENV name "Docker"
CMD echo $name
3、生成新的镜像 secondtonone1/alpine-cmd
docker build -t secondtonone1/alpine-cmd .
4、生成后生成容器
docker run --rm --name cmd secondtonone1/alpine-cmd
可以看到输出Docker了
接下来我们在容器启动时后边增加一个命令
docker run --rm -it --name cmd
secondtonone1/alpine-cmd sh
此时进入了容器内部,执行了sh命令。Dockerfile中的CMD被忽略了。
(二)RUN命令
是在构建镜像时执行的命令,我们可以安装一些应用。
例:Dockerfile文件如下:
FROM ubuntu:18.04
WORKDIR /workdir
RUN apt-get update
RUN apt-get install -y net-tools
CMD netstat
1、生成镜像
docker build -f Dockerfile -t cmd2 .
2、生成容器并启动
docker run -it --rm cmd2
可以看到容器启动后调用了cmd命令netstat
(三)ENTRYPOINT
和CMD不同,他不会被docker启动后执行的命令覆盖
例:Dockerfile文件如下:
FROM ubuntu:18.04
WORKDIR /workdir
RUN apt-get update
RUN apt-get install -y net-tools
ENTRYPOINT netstat
1、生成镜像
docker build -f Dockerfile -t cmd3 .
2、生成容器并启动
docker run -it --rm cmd3 /bin/bash
可以看到容器启动后并没有执行/bin/bash命令,而是调用了ENTRYPOINT命令netstat
(四)RUN和CMD、ENTRYPOINT支持参数形式命令 :
配置如下:
FROM ubuntu:18.04
WORKDIR /workdir
ENV name "Docker"
RUN ["/bin/bash", "-c", "apt-get update"]
RUN ["/bin/bash", "-c", "apt-get install -y net-tools"]
CMD ["/bin/bash","-c","echo Hello $name !"]
1、生成镜像
docker build -f ./Dockerfile -t cmd4 .
2、运行容器 :
docker run -it --rm cmd4
可以看到输出了Hello, Docker!