如何防止在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,但没有一个在我看来是对的。

  1. 将private_key存储在.env文件中,并且不带引号。 应用程序中的模块将对此值进行解码。
  2. 在应用程序的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读取一个简单的文件。