CMD/ENTRYPOINT 都是指定一个容器启动时要运行的命令
一、CMD
Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换。
Case讲解演示:(tomcat)
(1)执行命令:生成tomcat容器实例的时候,显示默认容器路径的目录
docker run -it --name tomcat-demo tomcat ls -l
输出结果:
这是为什么呢?
我们到Docker hub的官网查看一下tomcat的Dockerfile:
二、ENTRYPOINT (追加)
docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合。
Case讲解演示:(制作CMD版可以查询IP信息的容器)
编写自定义的Dockerfile(cmd版本):
FROM centos
RUN yum install -y curl
CMD [ "curl", "-s", "http://ip.cn" ]
构建(build):
hadoop@Docker:~/myDocker$ docker build -f ~/myDocker/Dockerfile -t centos:cmd .
Sending build context to Docker daemon 3.072kB
Step 1/3 : FROM centos
---> 75835a67d134
Step 2/3 : RUN yum install -y curl
---> Running in 67c67e8ffc8f
Loaded plugins: fastestmirror, ovl
Determining fastest mirrors
* base: mirrors.aliyun.com
* extras: mirrors.163.com
* updates: mirrors.aliyun.com
Package curl-7.29.0-46.el7.x86_64 already installed and latest version
Nothing to do
Removing intermediate container 67c67e8ffc8f
---> 99f208d9a380
Step 3/3 : CMD [ "curl", "-s", "http://ip.cn" ]
---> Running in 0a4bd2cf2f58
Removing intermediate container 0a4bd2cf2f58
---> 1afc862eecd7
Successfully built 1afc862eecd7
Successfully tagged centos:cmd
hadoop@Docker:~/myDocker$
运行:
我们可以看到可执行文件找不到的报错,executable file not found。之前我们说过,跟在镜像名后面的是 command,运行时会替换 CMD 的默认值。因此这里的 -i 替换了原来的 CMD,而不是添加在原来的 curl -s http://ip.cn 后面。而 -i 根本不是命令,所以自然找不到。
那么如果我们希望加入 -i 这参数,我们就必须重新完整的输入这个命令:
$ docker run myip curl -s http://ip.cn -i
命令:
docker run -it centos:cmd -i 等价于 如下Dockerfile
# Dockerfile
FROM centos
RUN yum install -y curl
CMD [ "i"]
CMD命令会被覆盖掉。
制作ENTROYPOINT版查询IP信息的容器:
Dockerfile文件内容如下:
FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
构建(build):
hadoop@Docker:~/myDocker$ docker build -f ~/myDocker/Dockerfile3 -t centos:entropy .
Sending build context to Docker daemon 4.096kB
Step 1/3 : FROM centos
---> 75835a67d134
Step 2/3 : RUN yum install -y curl
---> Using cache
---> 99f208d9a380
Step 3/3 : ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
---> Running in 5254fb4f1c16
Removing intermediate container 5254fb4f1c16
---> 906847735fbe
Successfully built 906847735fbe
Successfully tagged centos:entropy
hadoop@Docker:~/myDocker$ cat Dockerfile3
FROM centos
RUN yum install -y curl
ENTRYPOINT [ "curl", "-s", "http://ip.cn" ]
hadoop@Docker:~/myDocker$
运行: