2017-07-24 80 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))