2017-07-24 77 views
0

我想建立一个Dockerfile是建立我的项目多的基础图像(例如,Ubuntu的17.10为多种架构)命令行模板

我希望能够写类似

FROM {{ ARCH }}/ubuntu:17.10 
... 

并在制造时将其解析为ubuntu:17.10ppc64le/ubuntu:17.10。有没有办法做到这一点?

另外一个单独的解决方案可能是有两个码头文件,但不知何故将文件的公共部分包含到两个码头文件中。

+0

https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact – Grimmy

回答

1

您可以使用build argument并使用docker build --build-arg foo=bar来构建图像。

0

我的第一个想法是编写一个模板脚本,它可以将您的变量值替换为当时需要的值。这些值可以在调用或从环境变量中获取时传递到脚本中。

我想特别是在使用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))