STOPSIGNAL 现已在 Amazon ECS Fargate 上可用
Source: Dev.to
Fargate 现在支持 “STOP SIGNAL”
Amazon ECS Fargate 现在会将 Dockerfile 中定义的 STOPSIGNAL 命令发送给容器。
- 公告:
- 优雅关闭指南:
- OCI 合规性: 通过遵循 OCI 标准,在 Dockerfile 中指定
STOPSIGNAL可确保在 Fargate、Kubernetes 和本地 Docker 上实现优雅关闭,从而提升可移植性。
之前,在 ECS Fargate 上实现优雅关闭需要自定义逻辑来处理
SIGTERM。中间件在收到停止信号时往往具有固定行为(例如 Nginx:)。
Fargate 运行在 AWS 专有的托管主机操作系统(microVM/Firecracker)上,这可能限制对底层信号处理的直接访问。如果您有更多细节,欢迎分享。
用于验证的源代码仓库如下:
示例应用
一个简单的 Express 服务器演示了自定义停止信号的处理。
// server.js
const express = require('express');
const app = express();
const PORT = process.env.PORT || 8080;
const SHUTDOWN_DELAY_MS = parseInt(process.env.SHUTDOWN_DELAY_MS, 10) || 10000;
app.get('/', (req, res) => {
res.send('Running and waiting for stop signal...');
});
const server = app.listen(PORT, () => {
console.log(`Server running on port ${PORT}`);
});
// --- Signal Handlers ---
process.on('SIGTERM', () => {
handleShutdown('SIGTERM');
});
process.on('SIGINT', () => {
handleShutdown('SIGINT');
});
// SIGKILL cannot be caught
function handleShutdown(signal) {
console.log(`[${signal} RECEIVED] Graceful shutdown initiated.`);
// Stop accepting new connections
server.close(() => {
console.log('HTTP server closed.');
});
// Simulate cleanup work
console.log(`Starting cleanup. Waiting for ${SHUTDOWN_DELAY_MS / 1000} seconds...`);
setTimeout(() => {
console.log(`[${signal} SUCCESS] Cleanup complete. Exiting cleanly.`);
process.exit(0);
}, SHUTDOWN_DELAY_MS);
}
测试应用行为
- 接收
SIGINT并执行 10 秒的清理。 - 在 CloudWatch Logs 中记录
[SIGINT RECEIVED]。 - ECS 任务定义的
stopTimeout设置为 15 秒以进行验证。 - 在执行
cdk deploy(强制任务重新创建)后,容器会如预期收到SIGTERM。
Dockerfile
在 Dockerfile 中添加 STOPSIGNAL 即可更改用于优雅关闭的信号。
# Dockerfile
FROM node:22-slim
# ... other instructions ...
STOPSIGNAL SIGINT
CMD ["node", "server.js"]
部署后,再次运行 cdk deploy 会强制任务重新创建,容器能够正确捕获 SIGINT。
含义
此自定义停止信号支持不仅仅是一个额外参数——它表明 AWS Fargate 现已完全遵循 OCI(Open Container Initiative)标准 用于容器运行时。因此,运维人员可以直接将其他环境使用的标准镜像带到 Fargate,实现跨环境一致的优雅关闭行为。