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