如何在Docker Alpine镜像中装Python3.6.13运行Twitter机器人并解决报错
解决方案
1. Dockerfile固定Python 3.6.13版本的配置
你使用的python:3.6.13-alpine已经是官方提供的对应版本的最小化镜像,镜像内置Python版本严格为3.6.13,不需要额外做全局版本配置:
- 最初
python:3.6-alpine标签匹配的是3.6大版本下的最新小版本,并非固定3.6.13,所以会出现版本不匹配崩溃问题 - 保留
FROM python:3.6.13-alpine即可满足版本要求,且镜像体积远小于标准Debian系的Python镜像
2. ValueError报错的解决方法
报错核心原因是你代码中从环境变量读取的Twitter API凭证为空,os.getenv()读取不到对应环境变量时会返回None,传入oauthlib做转义时触发异常,和Alpine镜像本身无关,解决步骤如下:
- 第一步:在
config.py中新增环境变量非空校验,提前暴露配置问题,修改后的代码示例:
import tweepy import logging import os logger = logging.getLogger() def create_api(): consumer_key = os.getenv("CONSUMER_KEY_485") consumer_secret = os.getenv("CONSUMER_SECRET_485") access_token = os.getenv("ACCESS_TOKEN_485") access_token_secret = os.getenv("ACCESS_TOKEN_SECRET_485") # 新增非空校验 if not all([consumer_key, consumer_secret, access_token, access_token_secret]): logger.error("缺失Twitter API凭证环境变量,请检查运行配置") raise ValueError("API凭证配置不全") auth = tweepy.OAuthHandler(consumer_key, consumer_secret) auth.set_access_token(access_token, access_token_secret) api = tweepy.API(auth,wait_on_rate_limit=True) try: api.verify_credentials() except Exception as e: logger.error("Error creating API", exc_info=True) raise Exception logger.info("API created") return api
- 第二步:运行容器时传入对应环境变量
可以通过docker run的-e参数逐个传入:
docker run -e CONSUMER_KEY_485=你的对应密钥 \ -e CONSUMER_SECRET_485=你的对应密钥 \ -e ACCESS_TOKEN_485=你的对应密钥 \ -e ACCESS_TOKEN_SECRET_485=你的对应密钥 \ 你构建的镜像名称
也可以通过.env文件批量传入,避免命令过长。
3. 可选:进一步缩小镜像体积
修改Dockerfile的依赖安装命令,关闭pip缓存并清理临时文件,进一步压缩镜像体积:
FROM python:3.6.13-alpine COPY bots/config.py /bots/ COPY bots/stream.py /bots/ COPY requirements.txt /tmp # 新增--no-cache-dir参数,安装完后删除临时文件 RUN pip3 install --no-cache-dir -r /tmp/requirements.txt && \ rm -rf /tmp/* WORKDIR /bots CMD ["python3", "stream.py"]
内容的提问来源于stack exchange,提问作者Anil Dhage
相关产品推荐
相关产品推荐

