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 应用程序运行容器:
docker-compose run testenv
并尝试使用 ENV['KEY'] 变量:
irb(main):001:0> ENV['KEY']
=> "\"-----BEGIN PRIVATE KEY-----\\nBADANBgkqhki......xjiWsX7Qjoh8XH8nAECgYEAkCNIy1eICdUUt6HgV\\nnEGKpwDETJTIJdmW5MlOzsURI/RSnE2Qas/k758isGLaA4m9dZJoxuP/pCfwcvLj\\nwmjVBPdTTNF6ADgor6ZVIp6os5wIIurZH7f8yXaggTEyk5r8K6qxz9t/D\\n4FaPDsZ2icg0N5i2y/2Sa0w=\\n-----END PRIVATE KEY-----\\n\""
变量已转义,但我需要干净的 private_key。
我没有在 Docker 文档中找到答案。
我看到了两个可行的解决方案,但在我看来没有一个是正确的。
- 将 private_key 存储在经过编码且不带引号的 .env 文件中。 A 应用程序中的模块将解码此值。
- 应用中的转义值(像这样 Best way to escape and unescape strings in Ruby? )
有没有办法利用 Docker 的内置功能来解决这个问题?
最佳答案
您遇到了一个已知的 docker 问题:
https://github.com/moby/moby/issues/11443
Sorry for the inconvenience but I would rather go the conservative route on this one :( The problem can be solved with echo -e like you mentioned and I think the benefit of keeping env-file simple is higher. I'm going to close this issue, but feel free to continue the discussion and speak up if you disagree.
echo -e
在 ruby 中的等价物是用真正的换行符替换文字 '\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
但是我建议只挂载一个文件:
version: '2'
services:
testenv:
image: ruby:2.4-slim
volumes:
- ./keys.pem:/root/keys.pem
然后做一个从 ruby 读取的简单文件。
关于ruby - 如何防止转义传递到 docker 容器中的 ruby 应用程序的 ENV 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44910515/