Docker 两个CMD命令
Docker 是一个开源的容器化平台,它可以帮助我们将应用程序与其依赖项打包在一起,形成一个独立的可移植的容器。Docker 的核心概念是镜像(Image)和容器(Container),镜像是一个只读的模板,而容器则是根据镜像创建的运行实例。在 Docker 中,我们可以通过 CMD 命令来定义容器启动后要执行的命令。
什么是 CMD 命令
CMD 命令是 Dockerfile 中的一个指令,用于指定容器启动后要执行的命令。在 Dockerfile 中,我们可以使用多个 CMD 命令,但只有最后一个 CMD 命令会生效。CMD 命令有两种格式:
- CMD ["executable","param1","param2"]:用于执行给定的可执行文件及其参数,推荐使用这种格式。
- CMD command param1 param2:用于执行给定的命令及其参数。
示例代码
下面是一个使用 CMD 命令的示例 Dockerfile:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html
CMD ["nginx", "-g", "daemon off;"]
在上面的示例中,我们首先使用 FROM 命令指定了基础镜像为最新的 Ubuntu 镜像。然后使用 RUN 命令安装了 Nginx 服务器,并使用 COPY 命令将自定义的 index.html 文件复制到容器中的指定路径。最后,我们使用 CMD 命令来启动 Nginx 服务器并将其设置为前台运行。
在这个示例中,当我们使用 docker build 命令来构建镜像时,Docker 将按照 Dockerfile 中的指令依次执行,最终生成一个包含了 Nginx 服务器和 index.html 文件的镜像。当我们使用 docker run 命令来运行这个镜像时,Docker 将创建一个基于该镜像的容器,并自动执行 CMD 命令来启动 Nginx 服务器。
CMD 命令与 ENTRYPOINT 命令的区别
除了 CMD 命令外,Docker 还提供了 ENTRYPOINT 命令用于定义容器启动时要执行的命令。CMD 命令和 ENTRYPOINT 命令的区别在于 CMD 命令可以被 docker run 命令行中的参数覆盖,而 ENTRYPOINT 命令则不能。换句话说,CMD 命令定义的命令可以被用户灵活地替换,而 ENTRYPOINT 命令定义的命令则始终被执行。
下面是一个使用 CMD 命令和 ENTRYPOINT 命令的示例 Dockerfile:
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY index.html /var/www/html
ENTRYPOINT ["echo"]
CMD ["Hello, Docker!"]
在上面的示例中,我们首先使用 FROM 命令指定了基础镜像为最新的 Ubuntu 镜像。然后使用 RUN 命令安装了 Nginx 服务器,并使用 COPY 命令将自定义的 index.html 文件复制到容器中的指定路径。接下来,我们使用 ENTRYPOINT 命令将命令设置为 echo,然后使用 CMD 命令定义了一个默认参数 Hello, Docker!。
当我们使用 docker build 命令来构建镜像时,Docker 将按照 Dockerfile 中的指令依次执行,最终生成一个包含了 Nginx 服务器、index.html 文件和默认参数 Hello, Docker! 的镜像。当我们使用 docker run 命令来运行这个镜像时,Docker 将创建一个基于该镜像的容器,并执行 ENTRYPOINT 命令和 CMD 命令,输出 Hello, Docker!。
总结
CMD 命令是 Dockerfile 中的一个指令,用于指定容器启动后要执行的命令