Dockerfile未完整复制文件致discord.py bot容器启动失败求助
问题:Docker运行discord.py机器人提示模块缺失,文件复制异常
问题详情
尝试在Docker容器中运行discord.py机器人,执行sudo docker compose up后Docker提示“缺少模块”。排查发现Dockerfile未正确复制源代码的文件夹结构,镜像内仅存在bot文件夹内的文件,而非完整的bot文件夹,导致Python无法识别模块;同时容器内未安装机器人所需的依赖包。代码在容器外运行正常,排除机器人代码本身问题。
本地目录结构:
- 根目录包含
bot文件夹、docker-compose.yml、.env文件 bot文件夹内为机器人代码文件(需包含__init__.py以被识别为Python模块)
现有配置文件
docker-compose.yml
version: '3' services: bot: build: . restart: always volumes: - ./.env:/usr/src/app/.env
Dockerfile
FROM python:bullseye WORKDIR /usr/app/src COPY bot bot CMD ["python", "-m", "bot"]
解决方案
1. 修复Dockerfile的文件复制与依赖安装逻辑
修改COPY指令确保本地bot文件夹完整复制到容器内,同时添加依赖安装步骤(需确保本地根目录存在requirements.txt,列出discord.py等依赖包):
修改后的Dockerfile:
FROM python:bullseye WORKDIR /usr/app/src # 将本地bot文件夹完整复制到容器当前工作目录下的bot文件夹 COPY ./bot ./bot # 复制依赖文件并安装 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt CMD ["python", "-m", "bot"]
2. 补充requirements.txt(若未存在)
在本地根目录创建requirements.txt,添加机器人所需依赖,例如:
discord.py>=2.3.2 python-dotenv>=1.0.0
3. 修正.env文件挂载路径
原docker-compose.yml中挂载.env的目标路径与Dockerfile的工作目录不匹配,会导致机器人无法读取环境变量,修改为:
version: '3' services: bot: build: . restart: always volumes: - ./.env:/usr/app/src/.env
验证步骤
- 执行
sudo docker compose build重新构建镜像 - 执行
sudo docker compose up启动容器 - 若需确认镜像内文件结构,可执行
sudo docker run --rm -it <镜像名> ls /usr/app/src,检查bot文件夹是否存在
内容的提问来源于stack exchange,提问作者Mamey
相关产品推荐
相关产品推荐

