Dockerfile面试题(CMD、ENTRYPOINT与RUN命令对比)

目录

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! 

猜你喜欢

转载自blog.csdn.net/2302_77582029/article/details/132087828