35·Dockerfile进阶

Shell 与 Exec 形式

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 特性

练习编辑器

bash
Loading...