我正在尝试为discord.py bot设置Docker环境。我设法创建了一个Dockerfile
,它使用python:3.9-slim-buster
作为基本映像。当我在我的Ubuntu机器上运行Docker容器内的bot时,一切都很好。然而,如果我将MacBook与Apple Silicon M1芯片一起使用,它的行为会有所不同。运行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 bug还是有什么方法可以解决这个问题
编辑:
新增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"]
尽管您呈现了一个复杂的情况(许多移动部件),但罪魁祸首似乎是
ffmpeg
docker包,它不是针对Apple Silicon M1/ARM处理器的代码签名苹果硅设备只能运行签名文件。
以下是一些让
ffmpeg
工作的选项:使用pre-fab脚本构建
ffmpeg
在开始之前,您必须install arm64-based Homebrew到
/opt/homebrew
git clone https://github.com/mavaddat/ffmpeg-on-apple-silicon.git
cd ffmpeg-on-apple-silicon
chmod +x ./build.bash
./build.bash
李>在苹果硅芯片上DIY编译FFMPEG(M1/ARM处理器)
Download FFmpeg 4.4 (With ARM Neon patch) for Apple Silicon macOS 11.0 and Higher
SHA256校验和:5371a20db551b3e04593a052305eb97da3558b1d60271a4fc8f1763a37a6ac43
您可以在终端中对下载的文件进行特别签名:
注意:苹果硅的FFmpeg文件包括x265霓虹灯补丁。这使得x265的编码速度更快。
如何为macOS编译真正的静态FFmpeg文件
有几种编译FFmpeg的方法Homebrew是编译FFmpeg文件的一种简单方法,但遗憾的是它们不是静态的。
静态意味着您可以在任何地方复制FFmpeg文件。
与Homebrew那样的动态构建相比,它没有依赖性
下面的脚本将构建一个实际静态的FFmpeg文件。它并没有涵盖所有可能的外部库,但它将为您提供一个良好的开端。当然,你可以自己添加更多的lib,比如Theora,Vorbis,VPX,等等
首先,下载所有源文件(指向版本的链接可能已过时):
当然,还有,FFmpeg:
git clone git://git.ffmpeg.org/ffmpeg.git
您还需要安装Apple Xcode
为ARM(M1处理器)构建
🚧 如果您下载了较新版本的库,请在下面的脚本中相应地更新版本号。⚠️
由OSX专家提供:https://www.osxexperts.net
我在另一个项目中遇到了同样的问题
我不知道到底是什么问题,也不知道我是如何解决这个问题的,但我的猜测是,2021-08-30年的新python更新[例如v3.9.7](https://docs.python.org/release/3.9.7/whatsnew/changelog.html)]用OpenSSL 1.1.1 for mac修复了它,这对我来说毫无意义,因为这不会影响docker容器,但谁知道呢。 只需重建您的图像(使用新版本),看看它是否有效。对我来说是这样的
希望这有帮助:)
相关问题 更多 >
编程相关推荐