Discord 机器人 + Google 云 运行:"Container failed to start."

Discord Bot + Google Cloud Run: "Container failed to start."

我正在尝试部署一个用 python 编写并通过 Docker 容器化到 Google 云 运行.

的简单 Discord 机器人

Docker文件非常简单:

FROM python:3.9

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt

COPY . .

ENV PORT 8080
ENV HOST 0.0.0.0

CMD [ "python3", "discord_bot.py"]

我可以 运行 本地 Docker 容器中的机器人没有问题,还可以通过下面的 cloudmigrate.yaml 文件将其干净地推送到 Google 容器注册表。 .

steps:
  - id: "build image"
    name: "gcr.io/cloud-builders/docker"
    args: ["build", "-t", "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}", "."]

  - id: "push image"
    name: "gcr.io/cloud-builders/docker"
    args: ["push", "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}"]

substitutions:
  _SERVICE_NAME: discord-bot

images:
  - "gcr.io/${PROJECT_ID}/${_SERVICE_NAME}"

...但是当我尝试从容器构建云 运行 实例时,出现以下问题:

Cloud Run error: Container failed to start. Failed to start and then listen on the port defined by the PORT environment variable. Logs for this revision might contain more information

我在日志中遇到的唯一问题如下:

We have successfully logged in as <username redacted>

Cloud Rundiscord-bot {@type: type.googleapis.com/google.cloud.audit.AuditLog, resourceName: namespaces/<project name redacted>/services/discord-bot, response: {…}, serviceName: run.googleapis.com, status: {…}}
{@type: type.googleapis.com/google.cloud.audit.AuditLog, resourceName: namespaces/<project name redacted>/services/discord-bot, response: {…}, serviceName: run.googleapis.com, status: {…}}

奇怪的是,如上所示,我实际上在日志中收到一条消息,表明初始登录成功完成,但随后它就爆炸了...... python 脚本是一个非常简单的占位符,对吧现在...

import os
import discord

TOKEN = os.environ['DISCORD_BOT_LEVEL_TOKEN']

client = discord.Client()

@client.event
async def on_ready():
    print('We have successfully logged in as {0.user}'.format(client))

@client.event
async def on_message(message):

    #print(message)
    #print(dir(message))

    if message.author == client.user:
        return

    if message.content.lower() == 'hello':
        await message.channel.send(f'Hello, {message.author.display_name}!')
        return

    if message.content.lower() == 'bye':
        await message.channel.send(f'See you later, {message.author.display_name}!')
        return

client.run(TOKEN)

注意:我直接在云 运行 设置中添加了环境变量,因此在这种情况下这不是问题。

我确信这很简单,但我已经为此苦苦思索了几个小时...

您不能在云 运行 上 运行 discord,因为您的程序不会启动在 HTTP 端口上侦听连接的 HTTP 服务器。您的程序会创建一个连接到 Discord 的客户端。 Cloud 运行 健康检查认为您的容器未能成功启动。

总之,您有一个连接到服务器 (Discord) 的客户端程序,而不是侦听来自客户端的连接的服务器程序。

您可以启用 Cloud 运行 always-on CPU 分配,然后启动两个进程。 HTTP 服务器和 Discord 客户端。但是,您需要支付始终 运行ning 服务的费用。

Run more workloads on Cloud Run with new CPU allocation controls