容器启动命令ENTRYPOINT

ENTRYPOINT 也可以设置容器启动时要执行的命令,但是和CMD是有区别的。

CMD 设置的命令,可以在docker container run 时传入其它命令,覆盖掉 CMD 的命令,但是 ENTRYPOINT 所设置的命令是一定会被执行的。

ENTRYPOINTCMD 可以联合使用,ENTRYPOINT 设置执行的命令,CMD传递参数

  1. FROM ubuntu:21.04
  2. CMD ["echo", "hello docker"]

把上面的Dockerfile build成一个叫 demo-cmd 的镜象

  1. $ docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. demo-cmd latest 5bb63bb9b365 8 days ago 74.1MB
  1. FROM ubuntu:21.04
  2. ENTRYPOINT ["echo", "hello docker"]

build成一个叫 demo-entrypoint 的镜像

  1. $ docker image ls
  2. REPOSITORY TAG IMAGE ID CREATED SIZE
  3. demo-entrypoint latest b1693a62d67a 8 days ago 74.1MB

CMD的镜像,如果执行创建容器,不指定运行时的命令,则会默认执行CMD所定义的命令,打印出hello docker

  1. $ docker container run -it --rm demo-cmd
  2. hello docker

但是如果我们docker container run的时候指定命令,则该命令会覆盖掉CMD的命令,如:

  1. $ docker container run -it --rm demo-cmd echo "hello world"
  2. hello world

但是ENTRYPOINT的容器里ENTRYPOINT所定义的命令则无法覆盖,一定会执行

  1. $ docker container run -it --rm demo-entrypoint
  2. hello docker
  3. $ docker container run -it --rm demo-entrypoint echo "hello world"
  4. hello docker echo hello world
  5. $

Shell 格式和 Exec 格式

CMDENTRYPOINT同时支持shell格式和Exec格式。

Shell格式

  1. CMD echo "hello docker"
  1. ENTRYPOINT echo "hello docker"

Exec格式

以可执行命令的方式

  1. ENTRYPOINT ["echo", "hello docker"]
  1. CMD ["echo", "hello docker"]

注意shell脚本的问题

  1. FROM ubuntu:21.04
  2. ENV NAME=docker
  3. CMD echo "hello $NAME"

假如我们要把上面的CMD改成Exec格式,下面这样改是不行的, 大家可以试试。

  1. FROM ubuntu:21.04
  2. ENV NAME=docker
  3. CMD ["echo", "hello $NAME"]

它会打印出 hello $NAME , 而不是 hello docker ,那么需要怎么写呢? 我们需要以shell脚本的方式去执行

  1. FROM ubuntu:21.04
  2. ENV NAME=docker
  3. CMD ["sh", "-c", "echo hello $NAME"]