如何使用Dockerfile在Docker中运行eval $ {envkey-source)命令?

时间:2019-05-22 09:29:35

标签: docker

我想运行命令eval $(envkey-source),以使用envkey设置某些环境变量。我安装它,设置我的ENVKEY变量,然后尝试导入所有环境变量。我全部通过Docker完成。但是,docker在此命令中给出了错误:

Step 31/35 : RUN     eval $(envkey-source)
 ---> Running in 6a9ebf1ede96
/bin/sh: 1: export: : bad variable name
The command '/bin/sh -c eval $(envkey-source)' returned a non-zero code: 2

我尝试阅读envkey的文档,但他们对Docker一无所知。

我已经使用以下命令安装了envkey:

ENV     ENVKEY=yada_yada
RUN     curl -s https://raw.githubusercontent.com/envkey/envkey-source/master/install.sh | bash

直到这里,一切顺利。我在控制台上得到了有关如何运行envkey来获取所有环境变量设置的详细建议。 问题出在这方面:

RUN     eval $(envkey-source)

错误:

Step 31/35 : RUN     eval $(envkey-source)
 ---> Running in 6a9ebf1ede96
/bin/sh: 1: export: : bad variable name
The command '/bin/sh -c eval $(envkey-source)' returned a non-zero code: 2

1 个答案:

答案 0 :(得分:0)

由于某些原因,您无法执行此操作。最终,envkey文档链接到an example in their GitHub,您可能会找到有用的信息。

每个Dockerfile RUN命令在新容器中运行一个新的Shell。特别是,RUN命令中设置的环境变量在退出后会丢失。 RUN export ...的任何形式都是禁止操作的。如果变量是静态的,则可以使用ENV指令设置它们,但是在这种情况下,如果您正在运行需要动态生成它们的程序,则需要另一种方法。

这里的典型模式是使用shell脚本作为容器的ENTRYPOINT。进行一些初始设置,然后将其自身替换为容器的CMD。由于CMD与脚本的其余部分在相同的Shell环境中运行,因此您可以在此处进行动态变量设置。该脚本可能类似于:

#!/bin/sh
eval "$(envkey-source)"
exec "$@"

这里要记住的另一件事是,任何人都可以docker inspect删除您的图像并将其环境变量取回,或者docker run imagename /usr/bin/env。如果您可以在Dockerfile中运行envkey-source,则环境变量将在图像中以明文形式显示,这违背了目的。甚至将密钥嵌入图像中也会有效地泄漏它。您应该在运行时使用docker run -e选项或Docker Compose environment:密钥传递此密码,并从主机环境进行中继。