我正在尝试抓取一个网站,并在抓取后向 Telegram 发送警报。它在没有 Docker 的本地环境中运行。在使用 Docker 进行设置后,我开始收到 \'ETIME...
我正在尝试抓取一个网站,并在抓取后向 Telegram 发送警报。它在没有 Docker 的本地环境中工作。在使用 Docker 设置它之后,我在发送警报时开始收到 \'ETIMEDOUT\' 错误。我很困惑为什么会发生这个错误,因为我仍然可以抓取网站。我尝试过重新启动容器并添加 Google DNS,但它仍然无法持续工作。有时,它尝试几次后会成功,然后继续失败。我很确定 URL 也是正确的。我的操作系统是 Ubuntu。
我用其他 api 做了一些测试。当我调用 google.com 和 jsonplaceholder 时,它可以工作。只有使用 telegram bot api 时才不起作用。域名是 https://api.telegram.org 。其他人说要使用代理。但我住在泰国,甚至无法从我当地的 docker 容器调用。
这是我的 Axios 代码和错误消息。
async sendToTelegram(text: string) {
let token = process.env.TELEGRAM_BOT_TOKEN;
let url = `https://api.telegram.org/bot${token}/sendMessage`;
console.log(url);
let group_id = process.env.TELEGRAM_GROUP_ID;
let params = {
chat_id: group_id ? group_id : "",
text
};
await axios.get(url, { params });
}
可能是 Docker MTU 导致了这个问题。要解决这个问题,你需要将它添加到你的 /etc/docker/daemon.json
.
{
"mtu": 1450
}
这将设置 mtu
为 1450。 docker run
如果您使用 docker compose
,则无需编辑该文件,而是直接在您的 docker-compose.yml
文件中进行配置,如下所示:
networks:
default: # Or your network name
driver: bridge
driver_opts:
com.docker.network.driver.mtu: 1450
默认情况下,Docker MTU 设置为 1500。在上面的设置中,它设置为 1450。要找出 Ubuntu 机器上的 MTU 号码,你可以运行
$ ip link | grep mtu
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc fq_codel state UP mode DEFAULT group default qlen 1000
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
然后,从您的网卡上选择号码。在本例中,它是 ens3
.