我想建立一個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