Shell 与 Exec 形式
两种形式
# Shell 形式:通过 /bin/sh -c 执行
RUN echo hello
CMD node server.js
ENTRYPOINT python app.py
# Exec 形式:直接执行
RUN ["echo", "hello"]
CMD ["node", "server.js"]
ENTRYPOINT ["python", "app.py"]
关键区别
Shell 形式:
/bin/sh -c "node server.js"
→ PID 1 是 sh,不是 node
→ 信号发给 sh,node 收不到 SIGTERM
Exec 形式:
node server.js
→ PID 1 是 node
→ 信号直接发给 node,可以优雅关闭
最佳实践
# ✅ 用 Exec 形式
CMD ["node", "server.js"]
ENTRYPOINT ["python", "app.py"]
# ✅ 需要 shell 特性时用 Shell 形式
RUN apt-get update && apt-get install -y curl
# ❌ 避免:Shell 形式的 CMD/ENTRYPOINT
CMD node server.js # 信号处理有问题
环境变量
# Shell 形式可以使用环境变量
CMD echo $HOME
# Exec 形式不行(需要用 shell 包装)
CMD ["sh", "-c", "echo $HOME"]
小结
| 形式 | 优点 | 缺点 |
|---|
| Shell | 支持变量、管道 | PID 1 不是应用 |
| Exec | 信号处理正确 | 不支持 shell 特性 |