我想建立一个Dockerfile是建立我的项目多的基础图像(例如,Ubuntu的17.10为多种架构)命令行模板
我希望能够写类似
FROM {{ ARCH }}/ubuntu:17.10
...
并在制造时将其解析为ubuntu:17.10
或ppc64le/ubuntu:17.10
。有没有办法做到这一点?
另外一个单独的解决方案可能是有两个码头文件,但不知何故将文件的公共部分包含到两个码头文件中。
我想建立一个Dockerfile是建立我的项目多的基础图像(例如,Ubuntu的17.10为多种架构)命令行模板
我希望能够写类似
FROM {{ ARCH }}/ubuntu:17.10
...
并在制造时将其解析为ubuntu:17.10
或ppc64le/ubuntu:17.10
。有没有办法做到这一点?
另外一个单独的解决方案可能是有两个码头文件,但不知何故将文件的公共部分包含到两个码头文件中。
您可以使用build argument并使用docker build --build-arg foo=bar
来构建图像。
我的第一个想法是编写一个模板脚本,它可以将您的变量值替换为当时需要的值。这些值可以在调用或从环境变量中获取时传递到脚本中。
我想特别是在使用python的string.Template模块,并使用分隔符的$
而非{
因为{
可能会在Dockerfile其他地方使用。 $
是string.Template
的默认分隔符。另外我会用不同的扩展名来命名这个模板文件,因为Docker将无法使用里面的模板变量来构建它。
比方说,你Dockerfile.template
看起来是这样的:
FROM $ARCH/ubuntu:17.10
...
则可以创建并在会话环境变量ARCH=ppc64le
和运行这样一个简短的脚本:
import os
import string
with open('Dockerfile.template', 'r') as f:
template = string.Template(f.read())
with open('Dockerfile', 'w') as f:
args = {key: value.strip() for (key, value) in os.environ.items()}
f.write(template.substitute(**args))
这两行读你模板文件并创建一个string.Template
对象。 string.Template
的默认分隔符是$
,因此它符合您的模板。
with open('Dockerfile.template', 'r') as f:
template = string.Template(f.read())
这只是使我们以创建并写入您的实际Dockerfile
with open('Dockerfile', 'r') as f:
这行看中的是这里的环境变量进来玩。 os.environ是你os的环境变量的映射对象。 os.environ.items()
将每一对解压缩到相应的键:值元组中。 value.strip()
只是清理值,以确保没有奇怪的空格。所有这一切都被包装成字典解析,其中变量key
是环境变量的名称,并在这种情况下,模板变量,并将其映射这个变量的值
args = {key: value.strip() for (key, value) in os.environ.items()}
最后我们这一行。 template.substitute()
接收映射对象并尝试将所有键替换为其值。 **args
展开字典。
f.write(template.substitute(**args))
https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact – Grimmy