CMD
CMD命令是在容器启动后执行的命令,一个Dockerfile可以有多个CMD,但是只有最后一个CMD生效。当容器启动时如果指定了命令,那么CMD的命令将被忽略。
写一个Dockerfile
FROM alpine:latest
WORKDIR /workdir
ENV name "Docker"
CMD echo $name
生成新的镜像 secondtonone1/alpine-cmd
docker build -t secondtonone1/alpine-cmd .
生成后生成容器
docker run --rm --name cmd secondtonone1/alpine-cmd
可以看到输出docker了
接下来我们在容器启动时后边增加一个命令
docker run --rm -it --name cmd secondtonone1/alpine-cmd sh
此时进入了容器内部,执行了sh命令。Dockerfile中的cmd被忽略了。
RUN
run命令是在构建镜像时执行的命令,我们可以安装一些应用。
FROM ubuntu:18.04
WORKDIR /workdir
RUN apt-get update
RUN apt-get install -y net-tools
CMD netstat
生成镜像
docker build -f Dockerfile -t cmd2 .
生成容器并启动
docker run -it --rm cmd2
可以看到容器启动后调用了cmd命令netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
ENTRYPOINT
ENTRYPOINT 和CMD不同,他不会被docker启动后执行的命令覆盖
FROM ubuntu:18.04
WORKDIR /workdir
RUN apt-get update
RUN apt-get install -y net-tools
ENTRYPOINT netstat
生成镜像
docker build -f Dockerfile -t cmd3 .
生成容器并启动
docker run -it --rm cmd3 /bin/bash
可以看到容器启动后并没有执行/bin/bash命令,而是调用了ENTRYPOINT命令netstat
Active Internet connections (w/o servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
Active UNIX domain sockets (w/o servers)
Proto RefCnt Flags Type State I-Node Path
RUN和CMD支持参数形式命令
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 !"]
生成镜像
docker build -f ./Dockerfile -t cmd4 .
运行容器
docker run -it --rm cmd4
可以看到输出了Hello, Docker!
本文详细介绍了Dockerfile中CMD、RUN和ENTRYPOINT的用法。CMD定义容器启动默认命令,可被启动时指定的命令覆盖;RUN用于构建镜像时执行命令,如安装软件;ENTRYPOINT则在容器启动时始终执行,不受启动命令影响。通过示例展示了如何构建和运行Docker镜像及容器。

1万+

被折叠的 条评论
为什么被折叠?



