一、项目背景
本项目开发了一个早报定时任务程序,为实现该程序在不同环境下的便捷部署,采用 Docker 技术将其打包成镜像。在开发和部署过程中,因官方网络不稳定等因素,对项目依赖文件和 Docker 构建文件进行了相应调整。经过一系列调试与优化,确保了镜像的顺利构建与程序的稳定运行。
二、调试环境
操作系统
Windows 操作系统
开发工具
- Python 3.11.1
- Docker Desktop
依赖库
- Flask==2.2.2
- requests==2.28.1
- apscheduler==3.11.0
- dashscope==1.22.1
- tzlocal
- aiohttp
- websocket - client
- pytz
三、使用 Docker 构建镜像
3.1 准备 requirements.txt
文件
在项目根目录下创建 requirements.txt
文件,明确列出项目所需的依赖库及其版本,以确保不同环境下依赖的一致性。文件内容如下:
收起
plaintext
Flask==2.2.2
requests==2.28.1
apscheduler==3.11.0
dashscope==1.22.1
tzlocal==4.3
aiohttp==3.8.4
websocket-client==1.5.1
pytz==2024.1
3.2 准备 Dockerfile
文件
为应对官方网络不稳定问题,使用阿里云的 Python 镜像并更换 pip
源,在项目根目录下创建 Dockerfile
,内容如下:
收起
Dockerfile
# 基于阿里云的 Python 3.11.1 镜像构建
FROM alibaba-cloud-linux-3-registry.cn-hangzhou.cr.aliyuncs.com/alinux3/python:3.11.1@sha256:ab4a0714fe4bd05c47c8199bb626ba4d3d94a5ec91d75bde1d9e1cdfb915669e
# 设置工作目录
WORKDIR /app
# 将当前目录下的所有文件复制到容器的 /app 目录下
COPY . /app
# 更换 pip 源并安装项目所需的依赖
RUN pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ && \
pip install --no-cache-dir -r requirements.txt
# 设置容器启动时执行的命令
CMD ["python", "main.py"]
3.3 构建 Docker 镜像
在终端中切换到项目根目录,执行以下命令构建镜像:
收起
bash
docker build -t morning_news_scheduler:latest .
其中,morning_news_scheduler
是镜像名称,latest
是标签,.
表示使用当前目录下的 Dockerfile
进行构建。
四、镜像文件运行过程中的注意事项
4.1 容器命名冲突
当使用 docker run
命令创建并运行容器时,需要确保容器名称的唯一性。如果使用已存在的容器名,会出现冲突错误,例如:
收起
plaintext
docker: Error response from daemon: Conflict. The container name "/morning_news_container" is already in use by container "xxxxxx". You have to remove (or rename) that container to be able to reuse that name.
解决办法是先停止并删除已存在的容器,或者使用不同的容器名。
4.2 资源限制(可选)
如果程序对系统资源有特定要求,可以在运行容器时通过参数限制资源使用。例如,限制容器使用的 CPU 和内存:
收起
bash
docker run -d --cpus=0.5 --memory=512m --name morning_news_container morning_news_scheduler:latest
上述命令限制容器最多使用 0.5 个 CPU 核心和 512MB 内存。
五、调试步骤以确保镜像在本地部署成功
5.1 运行容器
使用以下命令运行容器:
收起
bash
docker run -d --name morning_news_container morning_news_scheduler:latest
5.2 查看容器状态
使用 docker ps
命令查看容器是否正在运行:
收起
bash
docker ps
如果容器没有正常运行,可以使用 docker ps -a
查看所有容器(包括已停止的容器),并使用 docker logs
命令查看容器日志:
收起
bash
docker logs morning_news_container
5.3 解决依赖问题
如果日志中显示缺少依赖库的错误,需要检查 requirements.txt
文件是否包含所有依赖,确保版本号正确。由于已更换 pip
源为阿里云镜像源,通常可以加快依赖下载速度,避免因官方网络不稳定导致的下载失败。若仍然存在问题,可手动尝试更新 pip
并重新安装依赖:
收起
bash
docker exec -it morning_news_container pip install --upgrade pip
docker exec -it morning_news_container pip install -r requirements.txt
5.4 解决代码问题
如果日志中显示代码运行时错误,需要检查代码逻辑,进行调试和修改。修改代码后,重新构建镜像并运行容器。
5.5 验证定时任务
等待定时任务触发时间,查看容器日志是否有任务执行的相关输出。如果没有输出,可以修改代码将定时任务触发时间调整为接近当前时间,方便快速验证。
5.6 异常处理调试
在代码中添加更多的异常处理和日志输出,方便定位问题。例如,在 main
函数中添加日志记录:
收起
python
import logging
def main():
logging.basicConfig(level=logging.INFO)
try:
logging.info("早报任务开始执行...")
# 这里添加早报任务的具体逻辑
logging.info("早报任务执行完毕。")
except Exception as e:
logging.error(f"早报任务执行出错: {e}")
六、镜像保存
6.1 停止并删除容器
收起
bash
docker stop morning_news_container
docker rm morning_news_container
6.2 保存镜像为 tar 文件
收起
bash
docker save -o morning_news_scheduler.tar morning_news_scheduler:latest
6.3 验证保存结果
收起
bash
ls morning_news_scheduler.tar
七、总结
通过使用 Docker 构建镜像,并对 requirements.txt
和 Dockerfile
进行针对性调整,有效应对了官方网络不稳定的问题,方便地将早报定时任务程序部署到不同的环境中。在运行镜像时,需要注意容器命名、资源限制等问题。通过逐步调试,可以解决依赖问题、代码问题和定时任务执行问题,确保镜像能在本地成功部署。最终将镜像保存为 tar
文件,便于后续上传和分发。