关于docker:Docker-entrypoint与cmd解析

66次阅读

共计 1636 个字符,预计需要花费 5 分钟才能阅读完成。

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

正文完
 0