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 (推荐)

通用的方法,在EntryPoint中指定命令,在CMD中指定参数

# prometheus通过CMD指定运行参数
USER       nobody
EXPOSE     9090
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

你可能感兴趣的:(Docker -- entrypoint与cmd解析)