当我尝试运行使用 Docker 容器内的 telethon 将文件发送到聊天的 python 脚本时,我收到 ValueError: Your API ID or Hash can not be empty or None 。我用 cron 安排的。
这是我的 docker_compose 文件的一部分...
...
name_xyz:
env_file: .env
environment:
PYTHONUNBUFFERED: 1
TELEGRAM_POSTING_API_HASH: ${TELEGRAM_POSTING_API_HASH}
TELEGRAM_POSTING_API_ID: ${TELEGRAM_POSTING_API_ID}
build:
context: ./xyz/
dockerfile: Dockerfile
volumes:
- ./xyz:/app
working_dir: /app/xyz/
restart: always
command: ./entrypoint.sh
...
所以......在我的Python脚本中我有:
import os
import asyncio
import requests
from telethon import TelegramClient
TELEGRAM_POSTING_API_HASH = os.getenv('TELEGRAM_POSTING_API_HASH')
TELEGRAM_POSTING_API_ID = os.getenv('TELEGRAM_POSTING_API_ID')
client = TelegramClient('session_name', TELEGRAM_POSTING_API_ID, TELEGRAM_POSTING_API_HASH)
...
在我的 .env 文件中我有:
TELEGRAM_POSTING_API_ID=11111111111
TELEGRAM_POSTING_API_HASH=11111111111
我实际上不知道我做错了什么,也许我错过了一些东西。请帮忙!
我尝试在 python 脚本中对 api id 和 api hash 进行硬编码,效果非常好。 但是当我使用 os.getenv() 函数时,它给了我一个 ValueError: Your API ID or Hash can not be empty or None
当我将 docker compose 文件更改为:
name_xyz:
env_file: .env
environment:
PYTHONUNBUFFERED: 1
TELEGRAM_POSTING_API_HASH: ${TELEGRAM_POSTING_API_HASH}
TELEGRAM_POSTING_API_ID: ${TELEGRAM_POSTING_API_ID}
build:
context: ./xyz/
dockerfile: Dockerfile
volumes:
- ./xyz:/app
working_dir: /app/xyz/telegram
restart: always
command: python3 my_python_script.py
它也可以工作......所以我想也许是它的cron。
这是我的入口点.sh
#!/bin/bash
# Start the run once job.
echo "Docker container has been started"
# shellcheck disable=SC2046
# Setup a cron schedule
echo "SHELL=/bin/bash
*/2 * * * * cd /app/xyz/telegram/ && python3 my_python_script.py >> /var/log/cron.log 2>&1
# This extra line makes it a valid cron" > scheduler.txt
crontab scheduler.txt
cron -f
当 cron 执行作业时,它不会加载环境变量,因为 cron 从非交互式 shell 运行作业。由于我的程序需要环境变量才能正常运行,因此我收到了该错误。
我通过在入口点.sh 中添加环境变量作为 shell 变量来解决这个问题
我希望您觉得这个答案有用! 😁