如何防止在docker容器中传递给ruby应用程序的ENVvariables
keys.env包含私钥:
KEY="-----BEGIN PRIVATE KEY-----\nBADANBgkqhki......xjiWsX7Qjoh8XH8nAECgYEAkCNIy1eICdUUt6HgV\nnEGKpwDETJTIJdmW5MlOzsURI/RSnE2Qas/k758isGLaA4m9dZJoxuP/pCfwcvLj\nwmjVBPdTTNF6ADgor6ZVIp6os5wIIurZH7f8yXaggTEyk5r8K6qxz9t/D\n4FaPDsZ2icg0N5i2y/2Sa0w=\n-----END PRIVATE KEY-----\n"
(KEY的值应该用引号括起来,因为它包含\ n)
docker-compose.yml包含env_file参数:
version: '2' services: testenv: image: ruby:2.4-slim env_file: - ./keys.env
我用ruby app运行容器:
docker-compose run testenv
并尝试使用ENV ['KEY']variables:
irb(main):001:0> ENV['KEY'] => "\"-----BEGIN PRIVATE KEY-----\\nBADANBgkqhki......xjiWsX7Qjoh8XH8nAECgYEAkCNIy1eICdUUt6HgV\\nnEGKpwDETJTIJdmW5MlOzsURI/RSnE2Qas/k758isGLaA4m9dZJoxuP/pCfwcvLj\\nwmjVBPdTTNF6ADgor6ZVIp6os5wIIurZH7f8yXaggTEyk5r8K6qxz9t/D\\n4FaPDsZ2icg0N5i2y/2Sa0w=\\n-----END PRIVATE KEY-----\\n\""
该variables是逃脱,但我需要干净的private_key。
我还没有在Docker文档中find答案。
我看到两个工作的解决scheme,但没有一个在我看来是对的。
- 将private_key存储在.env文件中,并且不带引号。 应用程序中的模块将对此值进行解码。
- 在应用程序的Unescape价值(像这样最好的方法来逃避和unescapestring在Ruby? )
有没有办法通过Docker的内置function来解决这个问题?
你已经遇到了一个已知的docker问题:
https://github.com/moby/moby/issues/11443
对不便之处,我宁愿去这个保守的路线:(问题可以用echo -e解决,就像你提到的,我认为保持env文件简单的好处是更高的,我要closures这个问题,但随时继续讨论,如果你不同意,说出来。
echo -e
ruby中的等价物正在用真正的换行符replace文字“\ n”:
ENV['KEY'].gsub('\n', "\n")
并删除双引号,留下这样的:
KEY=-----BEGIN PRIVATE KEY-----\nBADANBgkqhki......xjiWsX7Qjoh8XH8nAECgYEAkCNIy1eICdUUt6HgV\nnEGKpwDETJTIJdmW5MlOzsURI/RSnE2Qas/k758isGLaA4m9dZJoxuP/pCfwcvLj\nwmjVBPdTTNF6ADgor6ZVIp6os5wIIurZH7f8yXaggTEyk5r8K6qxz9t/D\n4FaPDsZ2icg0N5i2y/2Sa0w=\n-----END PRIVATE KEY-----\n
但我build议只装载一个文件:
version: '2' services: testenv: image: ruby:2.4-slim volumes: - ./keys.pem:/root/keys.pem
然后从ruby读取一个简单的文件。