Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 算法 小程序 Arthas JVM juc AQS Docker DevOps


Docker CMD ENTRYPOINT 区别

Docker 大约 2543 字

CMD

官方文档: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

制作镜像并执行:都不会追加CMDrun中的参数。(命令行指定--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中的部分。

阅读 275 · 发布于 2022-01-31

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批