容器启动命令ENTRYPOINT
ENTRYPOINT
也可以设置容器启动时要执行的命令,但是和CMD
是有区别的。
CMD
设置的命令,可以在docker container run
时传入其它命令,覆盖掉 CMD
的命令,但是 ENTRYPOINT
所设置的命令是一定会被执行的。
ENTRYPOINT
和 CMD
可以联合使用,ENTRYPOINT
设置执行的命令,CMD
传递参数
FROM ubuntu:21.04
CMD ["echo", "hello docker"]
把上面的Dockerfile build成一个叫 demo-cmd 的镜象
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
demo-cmd latest 5bb63bb9b365 8 days ago 74.1MB
FROM ubuntu:21.04
ENTRYPOINT ["echo", "hello docker"]
build成一个叫 demo-entrypoint 的镜像
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
demo-entrypoint latest b1693a62d67a 8 days ago 74.1MB
CMD
的镜像,如果执行创建容器,不指定运行时的命令,则会默认执行CMD
所定义的命令,打印出hello docker
$ docker container run -it --rm demo-cmd
hello docker
但是如果我们docker container run
的时候指定命令,则该命令会覆盖掉CMD
的命令,如:
$ docker container run -it --rm demo-cmd echo "hello world"
hello world
但是ENTRYPOINT
的容器里ENTRYPOINT
所定义的命令则无法覆盖,一定会执行
$ docker container run -it --rm demo-entrypoint
hello docker
$ docker container run -it --rm demo-entrypoint echo "hello world"
hello docker echo hello world
$
Shell 格式和 Exec 格式
CMD
和ENTRYPOINT
同时支持shell
格式和Exec
格式。
Shell格式
CMD echo "hello docker"
ENTRYPOINT echo "hello docker"
Exec格式
以可执行命令的方式
ENTRYPOINT ["echo", "hello docker"]
CMD ["echo", "hello docker"]
注意shell脚本的问题
FROM ubuntu:21.04
ENV NAME=docker
CMD echo "hello $NAME"
假如我们要把上面的CMD改成Exec格式,下面这样改是不行的, 大家可以试试。
FROM ubuntu:21.04
ENV NAME=docker
CMD ["echo", "hello $NAME"]
它会打印出 hello $NAME
, 而不是 hello docker
,那么需要怎么写呢? 我们需要以shell脚本的方式去执行
FROM ubuntu:21.04
ENV NAME=docker
CMD ["sh", "-c", "echo hello $NAME"]
网友评论