【发布时间】:2021-10-06 04:14:56
【问题描述】:
我正在尝试为我的 discord.py 机器人设置 Docker 环境。我设法创建了一个Dockerfile,它使用python:3.9-slim-buster 作为基础镜像。当我在我的 Ubuntu 机器上的 Docker 容器中运行机器人时,一切都运行良好。但是,如果我使用带有 Apple Silicon M1 芯片的 MacBook,它的行为会有所不同。在运行bot.py 脚本并使其加入语音通道后,它在message.author.voice.channel.connect() 上崩溃并出现分段错误。
from discord.ext import commands
bot = commands.Bot('!')
@bot.event
async def on_message(message):
await message.author.voice.channel.connect()
bot.run(DISCORD_TOKEN)
结果是机器人加入了我的语音频道,然后立即崩溃。 这是我得到的输出:
Fatal Python error: Segmentation fault
Thread 0x0000ffffa6c071e0 (most recent call first):
File "/usr/local/lib/python3.9/threading.py", line 316 in wait
File "/usr/local/lib/python3.9/threading.py", line 574 in wait
File "/usr/local/lib/python3.9/site-packages/discord/gateway.py", line 133 in run
File "/usr/local/lib/python3.9/threading.py", line 973 in _bootstrap_inner
File "/usr/local/lib/python3.9/threading.py", line 930 in _bootstrap
Thread 0x0000ffffa74a71e0 (most recent call first):
File "/usr/local/lib/python3.9/concurrent/futures/thread.py", line 75 in _worker
File "/usr/local/lib/python3.9/threading.py", line 910 in run
File "/usr/local/lib/python3.9/threading.py", line 973 in _bootstrap_inner
File "/usr/local/lib/python3.9/threading.py", line 930 in _bootstrap
Current thread 0x0000ffffa8e22010 (most recent call first):
File "/usr/local/lib/python3.9/ssl.py", line 897 in write
File "/usr/local/lib/python3.9/asyncio/sslproto.py", line 261 in feed_appdata
File "/usr/local/lib/python3.9/asyncio/sslproto.py", line 674 in _process_write_backlog
File "/usr/local/lib/python3.9/asyncio/sslproto.py", line 598 in _write_appdata
File "/usr/local/lib/python3.9/asyncio/sslproto.py", line 386 in write
File "/usr/local/lib/python3.9/site-packages/aiohttp/http_writer.py", line 68 in _write
File "/usr/local/lib/python3.9/site-packages/aiohttp/http_writer.py", line 119 in write_headers
File "/usr/local/lib/python3.9/site-packages/aiohttp/client_reqrep.py", line 668 in send
File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 542 in _request
File "/usr/local/lib/python3.9/site-packages/aiohttp/client.py", line 754 in _ws_connect
File "/usr/local/lib/python3.9/site-packages/discord/http.py", line 132 in ws_connect
File "/usr/local/lib/python3.9/site-packages/discord/gateway.py", line 765 in from_client
File "/usr/local/lib/python3.9/site-packages/discord/voice_client.py", line 321 in connect_websocket
File "/usr/local/lib/python3.9/site-packages/discord/voice_client.py", line 353 in connect
File "/usr/local/lib/python3.9/site-packages/discord/abc.py", line 1285 in connect
File "/workspace/bot.py", line 7 in on_message
File "/usr/local/lib/python3.9/site-packages/discord/client.py", line 343 in _run_event
File "/usr/local/lib/python3.9/asyncio/events.py", line 80 in _run
File "/usr/local/lib/python3.9/asyncio/base_events.py", line 1890 in _run_once
File "/usr/local/lib/python3.9/asyncio/base_events.py", line 596 in run_forever
File "/usr/local/lib/python3.9/site-packages/discord/client.py", line 713 in run
File "/workspace/bot.py", line 9 in <module>
Segmentation fault
Docker 容器不应该在不同的机器上表现相同吗?你认为这是一个 Docker 错误还是有什么方法可以解决这个问题?
编辑:
已添加Dockerfile:
FROM python:3.9-slim-buster
ENV PYTHONFAULTHANDLER=1 \
PYTHONUNBUFFERED=1 \
PYTHONHASHSEED=random \
PIP_NO_CACHE_DIR=off \
PIP_DISABLE_PIP_VERSION_CHECK=on \
PIP_DEFAULT_TIMEOUT=100
RUN apt-get update && apt-get install -y \
build-essential libpq-dev git \
ca-certificates ffmpeg libopus-dev libsodium-dev ansible gcc git libffi-dev libsodium-dev make musl-dev
RUN pip install poetry
WORKDIR /app
COPY poetry.lock pyproject.toml /app/
RUN poetry config virtualenvs.create false && poetry install
COPY . /app
CMD ["python3", "bot.py"]
【问题讨论】:
-
你能把
Dockerfile也发完整个吗? -
Dockerfile已添加。 -
@mredy 你解决了吗?我在构建另一个使用
ssl的机器人时遇到了完全相同的问题。我试过 docker python imagesv3.9.7甚至3.10.0rc2-buster但似乎没有帮助。在ssldo_handshake期间仍然出现分段错误 -
@IljaLeiko,我花了更多的时间,我想花时间弄清楚,所以放弃并继续在我的 Linux 机器上进行开发。对不起。
-
没关系,谢谢@mredy。我实际上已经为我的情况解决了这个问题。发现问题确实在我的
ssl中(就像在分段错误之前的回溯显示一样)。问题是,无论我使用哪个pythondocker 映像,它总是放置openssl的过时版本,因此python 也在使用它。所以我不得不修改我的DockerFile以从源代码构建最新的openssl,删除现有的二进制文件,然后我的python 项目将使用最新的openssl版本。这为我解决了问题:) 奇怪的是,问题只在 M1 上对我来说:)
标签: python docker discord.py apple-m1