Portainer中Compose的Docker Swarm Secrets无法正确解析问题
Docker Secrets 无法在自制Python Discord Bot中正确解析的问题
我将自行编写的Python Discord Bot部署到家庭服务器上运行Portainer的虚拟机中,遇到Portainer无法正确解析Bot令牌Secret的问题。已定义名为HU3BOT_DISCORD_TOKEN的外部Secret,使用的Compose文件如下:
version: "3.9" services: hu3bot: image: drak3/hu3bot:latest environment: - DISCORD_TOKEN=/run/secrets/HU3BOT_DISCORD_TOKEN - DISCORD_CHANNEL="3d_printing" - PRINTER_HOST=voron.srv - CAM_PORT_MAIN=8081 - CAM_PORT_ALT=8080 - MOONRAKER_API_PORT=7125 - WEB_URL='https://fluidd.drak3.io' secrets: - HU3BOT_DISCORD_TOKEN # the secret is a discord bot token secrets: HU3BOT_DISCORD_TOKEN: external: true
本地使用.env文件运行脚本或本地容器均正常,但使用该Secret时无法正确解析。添加打印语句后发现,根据DISCORD_TOKEN的格式不同,令牌要么被解析为None(类型为<class 'NoneType'>),要么被解析为字符串/run/secrets/HU3BOT_DISCORD_TOKEN。
我尝试了多种格式组合,结果均为Secret名称或Null:
DISCORD_TOKEN=/run/secrets/HU3BOT_DISCORD_TOKENDISCORD_TOKEN= /run/secrets/HU3BOT_DISCORD_TOKENDISCORD_TOKEN:/run/secrets/HU3BOT_DISCORD_TOKENDISCORD_TOKEN: /run/secrets/HU3BOT_DISCORD_TOKEN"DISCORD_TOKEN=/run/secrets/HU3BOT_DISCORD_TOKEN""DISCORD_TOKEN= /run/secrets/HU3BOT_DISCORD_TOKEN""DISCORD_TOKEN:/run/secrets/HU3BOT_DISCORD_TOKEN""DISCORD_TOKEN: /run/secrets/HU3BOT_DISCORD_TOKEN"
另一个栈使用类似方式(WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=/run/secrets/DISCORD_WEBHOOK_WATCHTOWER)拉取Webhook Secret却能正常工作。
Secret内容会影响解析吗?我无从解释,恳请提供帮助或建议。
更新:
后续遇到同类问题的用户可参考:我意识到自己误解了Docker Secrets的工作原理。此前以为/run/secrets/secret_name可直接作为Secret值的字面量,传入环境变量等同于使用原始Secret。这种误解源于此前仅使用他人镜像,推测这些镜像有代码区分环境变量值与Docker Secret路径。在Bot中添加此类读取代码后,值可正常解析。
内容的提问来源于stack exchange,提问作者Drake
相关产品推荐
相关产品推荐

