在http://docs.docker.com/engine/reference/builder/#arg中,建议不要通过ARGS传递机密。
注意:不建议使用构建时变量来传递诸如github密钥,用户凭据等秘密信息。
通过构建时变量传递的机密在什么时候处于危险之中?
2018年8月更新:
您现在有了docker build --secret id=mysecret,src=/secret/file
。
2017年1月更新:
Docker(swarm)1.13具有dockersecret
。
然而,正如评论由史蒂夫·霍夫曼(bacoboy
):
[…] secret命令只能帮助群集用户,而不是更通用的解决方案(就像他们附加持久卷一样)。
您如何管理您的秘密(它们是什么,谁可以访问它们)在很大程度上取决于系统,并且取决于您拼凑哪些付款和/或OSS来构成“平台”。
随着Docker公司开始提供平台,我并不感到惊讶,因为Hashicorp将Vault集成到Atlas时,他们的第一个实现是基于群体的-这很有意义。秘密的传递方式真的不在太空的范围内
docker run
。
AWS通过授予/拒绝权限的角色和策略以及一个SDK来执行此类操作。
Chef使用加密的数据包和加密“引导程序”进行身份验证。
K8S具有自己的版本,该版本刚在1.13中发布。
我确定mesos会及时添加类似的实现。这些实现似乎分为两个阵营。
- 通过“平台”提供的卷装载传递秘密(或(厨师/码头工人秘密/ k8s
- 传递凭据以与外部服务对话以在启动时进行操作(iam / credstash / etc)
原始答案:2015年11月
这是在PR 54182的commit
54240f8(docker
1.9,2015年11月)中引入的,
构建环境位于中间容器的命令字符串之前,以帮助查找缓存。
它还有助于构建可追溯性。但是,从传递构建时间秘密的角度来看,这也使功能不太安全。
第13490期重申:
构建时环境变量
:构建时环境变量并非旨在处理机密信息。由于缺乏其他选择,人们正计划将其用于此目的。为了避免给人以它们适合秘密的印象,已决定在此过程中不对那些变量进行加密。
如9176条
评论中所述:
env变量是传递秘密的错误方法。我们不应该试图重新发明轮子,并立即提供一个严重的安全分发机制。
当您将秘密密钥存储在环境中时,您很容易不小心暴露它们-正是我们想要避免的事情:
- 鉴于该环境对于该过程隐式可用,因此很难(即使不是不可能)跟踪访问以及如何公开内容
* 让应用程序获取整个环境并打印出来是非常常见的,因为它对于调试非常有用,甚至可以作为错误报告的一部分发送。如此多的机密泄露给PagerDuty,以至于他们拥有一个完善的内部流程来将其从基础结构中清除。
* 环境变量向下传递给子进程,这允许意外访问并破坏了最小特权原则。想象一下,在您的应用程序中,您调用了第三方工具来执行某些操作,突然之间,第三方工具可以访问您的环境,而上帝知道该怎么做。- 对于崩溃的应用程序,将环境变量存储在日志文件中以供以后调试是很常见的。这意味着磁盘上的纯文本机密。
- 将秘密放入环境变量中很快就会变成部落知识。新工程师不知道他们在那里,也不知道在处理环境变量(将它们过滤到子流程等)时应该小心。
总体而言,env变量中的机密违反了最不令人惊讶的原则,是一种不良做法,并会最终导致机密泄露。
这里是Gradle 2.14和Groovy 2.4.7。我有以下groovy:
问题内容: 如何将主机环境变量(例如用户名和主机名)传递给dockerfile? 例如,如果我的用户名是: 如何编写Docker文件以获得相同的输出? 问题答案: 我遇到了同样的问题。我的解决方案是在docker-compose.yml内部提供变量,因为yml支持使用环境变量。 我认为这对我来说是最有效的方式,因为我不喜欢在命令行中使用类似以下内容一遍又一遍地键入它 在容器中,声明将无效,将设置为
问题内容: Docker 1.9允许将参数传递给dockerfile。参见链接:https : //docs.docker.com/engine/reference/builder/#arg 我该如何在ENTRYPOINT指令中传递相同的药品? 我的dockerfile有 ARG $ Version = 3.1 ENTRYPOINT /tmp/folder-$Version/sample.sh开始
问题内容: 为什么此代码无法编译? 为什么我不能将类变量传递给? 问题答案: 该操作符对引用类型,像,而不是对象,如。您可能想要类似 旁注:如果编写,您的代码将更加简洁 但是,我不确定是否需要某种方法。
问题内容: 我正在A中使用RUN指令安装rpm 但是,我想将值“ 2.3”作为参数传递。我的RUN指令应类似于: 哪里 问题答案: 您正在寻找和指导。这些是Docker 1.9中的新功能。查看https://docs.docker.com/engine/reference/builder/#arg。这将允许您添加到,然后使用构建。
问题内容: 为什么经常被称为 代替 ? W3,MDN和MSDN都声明它是可选的。此外,ActiveX控件似乎不需要参数: 这种做法至少可以追溯到2005年的Google Maps中 ,但被缩小了,没有任何解释: 问题答案: 如果您看一下XMLHttpRequest的旧规范,似乎W3C似乎并不需要在某一点上将该参数设为可选,这可能导致人们提供了一个明确的null值,以防万一。 (搜索“应支持发送”)