Docker CMD ENTRYPOINT 区别
Docker About 2,543 wordsCMD
官方文档:https://docs.docker.com/engine/reference/builder/#cmd
CMD
指令有三种方式
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
第一种
CMD ["executable","param1","param2"]
CMD
采用中括号方式,Dockerfile
内容:
FROM centos
CMD ["/bin/bash", "-c", "echo 'hello cmd!'"]
需要注意,采用中括号形式,那么第一个参数必须是命令的全路径才行。而且一个Dockerfile
至多只能有一个CMD
,如果有多个只有最后一个生效。官网推荐采用这种方法。
制作镜像并执行:
$ docker build -f ./demo_dockerfile demo:1.0 .
$ docker run demo:1.0
hello cmd!
如果我们在run
时指定了命令或者有Entrypoint
,那么CMD
就会被覆盖。
$ docker run demo:1.0 echo nihaoa
nihaoa
第二种
CMD ["param1","param2"]
作为默认的ENTRYPOINT
参数,再下文ENTRYPOINT
段落一起讲解。
第三种
CMD command param1 param2
CMD
采用非中括号方式,Dockerfile
内容:
FROM centos
CMD echo "hello world!"
制作镜像并执行:run
后直接带参数会报错,必须跟命令再跟参数,这样就会覆盖CMD
中的命令和参数。
$ docker build -f ./demo_dockerfile demo:2.0 .
$ docker run demo:2.0
hello world!
$ docker run demo:1.0 aaa
docker: Error response from daemon: OCI runtime create failed: container_linux.go:380: starting container process caused: exec: "aaa": executable file not found in $PATH: unknown.
ERRO[0000] error waiting for container: context canceled
$ docker run demo:1.0 echo aaa
aaa
ENTRYPOINT
官方文档:https://docs.docker.com/engine/reference/builder/#entrypoint
ENTRYPOINT
指令有两种方式
ENTRYPOINT ["executable", "param1", "param2"] (exec form, preferred)
ENTRYPOINT command param1 param2
第一种
ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT
采用中括号方式,Dockerfile
内容:
FROM centos
CMD ["param in cmd!"]
ENTRYPOINT ["echo"]
制作镜像并执行:默认会追加CMD
中的参数,如果run
中有参数则覆盖CMD
中的参数。
$ docker build -f ./demo_dockerfile -t demo:3.0 .
$ docker run demo:3.0
param in cmd!
run
后添加参数
$ docker run demo:3.0 hahaha
hahaha
ENTRYPOINT
采用中括号方式,Dockerfile
内容:
FROM centos
CMD ["param in cmd!"]
ENTRYPOINT ["echo", "param in entrypoint"]
制作镜像并执行:追加CMD
中的参数,run
中有参数则覆盖CMD
中的参数
$ docker build -f ./demo_dockerfile -t demo:4.0 .
$ docker run demo:4.0
param in entrypoint param in cmd!
$ docker run demo:4.0 param in run
param in entrypoint param in run
第二种
ENTRYPOINT command param1 param2
ENTRYPOINT
采用非中括号方式,Dockerfile
内容:
FROM centos
CMD ["param in cmd!"]
ENTRYPOINT echo param in entrypoint
制作镜像并执行:都不会追加CMD
或run
中的参数。(命令行指定--entrypoint
除外)
$ docker build -f ./demo_dockerfile -t demo:5.0 .
$ docker run demo:5.0
param in entrypoint
$ docker run demo:5.0 param in run!
param in entrypoint
总结
一般会用ENTRYPOINT ["executable", "param1", "param2"]
中括号形式的指令作为Docker
启动后的默认指令。
ENTRYPOINT
存放的是不变的内容,可变的参数使用CMD
提供默认版本,如果需要更改,就显示地在run
启动时指定,这样就会覆盖CMD
中的部分。
————        END        ————
Give me a Star, Thanks:)
https://github.com/fendoudebb/LiteNote扫描下方二维码关注公众号和小程序↓↓↓