Docker|Docker -- entrypoint与cmd解析

entrypoint和cmd用在dockerfile中,它们都可以指定容器启动时运行的命令,在使用时,通常用entrypoint指定命令,cmd指定命令参数。
exec和shell entrypoint和cmd的写法:exec模式、shell模式
exec模式:[]的写法,推荐使用

FROM ubuntu CMD [ "top" ]

容器运行时,top命令是1号进程。
shell模式:/bin/sh -c "cmd"的写法
FROM ubuntu CMD top

容器运行时,sh是1号进程,top是sh创建的子进程。
典型用法:CMD 简单的可以在CMD中指定:命令和参数
FROM ubuntu EXPOSE 8080 CMD [ "nginx", "-s", "reload" ]

典型用法:EntryPoint + CMD (推荐) 【Docker|Docker -- entrypoint与cmd解析】通用的方法,在EntryPoint中指定命令,在CMD中指定参数
# prometheus通过CMD指定运行参数 USERnobody EXPOSE9090 VOLUME[ "/prometheus" ] WORKDIR/prometheus ENTRYPOINT [ "/bin/prometheus" ]#exec写法:指定命令 CMD[ "--config.file=/etc/prometheus/prometheus.yml", \ "--storage.tsdb.path=/prometheus", \ "--web.console.libraries=/usr/share/prometheus/console_libraries", \ "--web.console.templates=/usr/share/prometheus/consoles" ]#exec写法:指定参数

典型用法:kubernetes 在pod的spec中,可以通过command参数覆盖镜像中的EntryPoint参数:
# kubectl explain pod.spec.containers.command DESCRIPTION: Entrypoint array. Not executed within a shell. The docker image's ENTRYPOINT is used if this is not provided.

在pod的spec中,可以通过args参数覆盖镜像中的CMD参数:
# kubectl explain pod.spec.containers.args DESCRIPTION: Arguments to the entrypoint. The docker image's CMD is used if this is not provided.

所以,为了业务应用的image可以在kubernetes上运行,推荐在镜像的dockerfile中:entrypoint指定命令,cmd指令参数,以便在运行时可以灵活覆盖。
比如Prometheus的container在kubernetes中运行时,使用args覆盖镜像中的CMD参数:
...... spec: containers: - args: - --web.console.templates=/etc/prometheus/consoles - --web.console.libraries=/etc/prometheus/console_libraries - --config.file=/etc/prometheus/config_out/prometheus.env.yaml - --storage.tsdb.path=/prometheus - --storage.tsdb.retention.time=24h - --web.enable-lifecycle - --storage.tsdb.no-lockfile - --web.route-prefix=/ image: 178.104.162.39:443/dev/huayun/amd64/prometheus:v2.20.0 imagePullPolicy: IfNotPresent

    推荐阅读