docker run --entrypoint 是调试容器启动逻辑最轻量有效的方式,它优先级最高,完全绕过镜像原有 entrypoint 和 cmd,直接指定第一进程,便于验证环境、挂载、权限等;执行顺序为 --entrypoint > dockerfile 中 entrypoint > cmd。
通过 docker run 指定自定义启动命令,本质是覆盖镜像默认的 entrypoint 或 cmd。关键看你想“完全替换”还是“追加参数”,以及镜像本身是如何定义启动行为的。
用 command 替换 CMD(最常用)
如果镜像只定义了 CMD(比如 nginx:alpine 默认是 ["nginx", "-g", "daemon off;"]),直接在 docker run 后跟新命令即可:
-
docker run nginx:alpine nginx -t→ 运行配置检查,不启动服务 -
docker run ubuntu:22.04 echo "hello"→ 输出 hello 后立即退出
此时你写的命令会**完全替代镜像的 CMD**,但不会影响 ENTRYPOINT(如果有的话)。
用 --entrypoint 覆盖 ENTRYPOINT
当镜像设置了 ENTRYPOINT(如 docker.io/library/python:3.11-slim 的 ["python3"]),仅写命令不够——它会被当成 ENTRYPOINT 的参数。想彻底换掉入口程序,必须用 --entrypoint:
-
docker run --entrypoint sh python:3.11-slim -c 'echo $PATH'→ 启动 shell 并执行命令 -
docker run --entrypoint /bin/bash ubuntu:22.04 -i -t→ 交互式 bash 终端
注意:--entrypoint 后面只写可执行文件路径,**不带参数**;参数要写在镜像名之后。
组合使用:覆盖 ENTRYPOINT + 传参
有时你既要换入口程序,又要给它传参。例如,想用 bash 启动一个原本设了 ENTRYPOINT 的镜像,并自动执行脚本:
docker run --entrypoint /bin/bash nginx:alpine -c "ls -l /usr/share/nginx/html"-
docker run --entrypoint sleep alpine:latest 5→ 不运行 nginx,而是睡 5 秒
这里 sleep 是新 ENTRYPOINT,5 是传给它的唯一参数。
查看镜像原有启动设置
不确定镜像怎么定义的?先查清楚再覆盖:
docker inspect nginx:alpine | jq '.[0].Config.{Cmd,Entrypoint}'- 或简要看:
docker inspect --format='{{.Config.Entrypoint}} {{.Config.Cmd}}' nginx:alpine
输出类似 [nginx] [-g daemon off;] 表示 ENTRYPOINT 是 nginx,CMD 是参数;若 ENTRYPOINT 为空,则 CMD 就是最终命令。











