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
我正在尝试部署一个用 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