我编写了一个 systemd 单元,它使用 PassEnvironment 启动一个可执行脚本,将一组环境变量传递给脚本。其中一个变量是从具有换行符的文件中读取的证书,它根本没有传递给脚本:打印它我没有得到任何内容。如果我删除换行符,那么变量会正确传递。
我想不出另一种将变量传递给脚本的方法:一切都在 docker 容器中运行,我开始定义包含证书的环境变量的值,该值是传递给 systemd 的容器进程,而后者又是容器进程将其传递给脚本。我无法将证书文件挂载为 docker 机密,因为一切都将在 Gitlab CI 中运行,因此我只能使用 env 变量来传递机密。而且出于安全原因,我也不能将证书放在图像中。
那么如何让 systemd 直接将带有换行符的 env 变量传递给脚本呢?我在 CentOS 容器中使用 systemd 219。
systemd 故意拒绝环境变量值中的“控制”字符,其中包括换行符。(我认为这些限制在以后的版本中可能会稍微放宽,但这对您的 v219 没有帮助。)
将秘密转换为不同的格式,例如将文件 Base64 编码为单行 - 然后让容器的脚本 Base64 对其进行解码,然后再传递给应用程序。