《早报定时任务 Docker 镜像调试与部署文档》

发布于:2025-02-18 ⋅ 阅读:(37) ⋅ 点赞:(0)

一、项目背景

本项目开发了一个早报定时任务程序,为实现该程序在不同环境下的便捷部署,采用 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 文件,便于后续上传和分发。