STOPSIGNAL 现已在 Amazon ECS Fargate 上可用

发布: (2025年12月14日 GMT+8 16:43)
3 min read
原文: Dev.to

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,实现跨环境一致的优雅关闭行为。

Back to Blog

相关文章

阅读更多 »

Jenkins 在 AWS + Docker

Jenkins 在 AWS + Docker 的封面图片 https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2F%2Fdev-to-upload...