如何使用sops exec-file搭配docker-compose?执行启动命令时永久阻塞
解决sops exec-file搭配Docker Compose阻塞的问题
问题分析
你遇到的情况核心原因是:Docker Compose在后台启动(-d参数)时,会默认保持标准输入(stdin)的连接,而sops exec-file会把自身的stdin传递给子进程,导致sops一直等待输入,从而永久阻塞。Podman对stdin的处理逻辑不同,所以能正常运行。
解决办法
1. 强制断开Docker Compose的stdin
在docker compose命令后追加< /dev/null,切断stdin连接,让它不会等待输入:
sops exec-file file.env "docker compose --env-file {} up -d < /dev/null"
2. 用sops的--no-stdin参数(部分版本支持)
如果你的sops版本支持--no-stdin,可以直接禁止sops传递stdin给子进程:
sops exec-file --no-stdin file.env "docker compose --env-file {} up -d"
3. 先解密再启动(兜底方案)
如果上面两种方法都不生效,可以先把加密的env文件解密到临时文件,再用Docker Compose加载,最后清理临时文件:
sops -d file.env > temp.env && docker compose --env-file temp.env up -d && rm temp.env
⚠️ 注意:临时文件会存储明文环境变量,要确保操作环境安全,避免敏感信息泄露。
内容的提问来源于stack exchange,提问作者Ado
相关产品推荐
相关产品推荐

