使用自定義的元數據
你可以通過標籤(lables)將元數據運用到你的鏡像、容器,或守護進程裏。元數據具有廣泛的用途。使用標籤可以爲鏡像添加註釋或許可信息,或識別一個主機。
一個標籤是一個 <key>
/ <value>
對。Docker將標籤的值保存爲字符串。你可以指定多個標籤,但是每對<key>
/ <value>
必須保證唯一,防止覆蓋。如果你多次指定相同的key
,但是值不一樣,這樣會導致後面指定會覆蓋前面。換而言之,Docker只會使用你最後key=value
提供的標籤。
注意:對守護進程的標籤支持是在Docker 1.4.1開始。對容器和鏡像是在Docker 1.6.0。
標籤的keys (命令空間)
Docker沒有硬性的限制你標籤key命令。然而,使用過於簡單key可能會引起衝突。例如,你可以通過 芯片的“架構”標籤將你的鏡像分類:
LABEL architecture="amd64"
LABEL architecture="ARMv7"
但是用戶可以根據構建架構風格對鏡像進行分類:
LABEL architecture="Art Nouveau"
爲了防止命令的衝突,Docker命令空間標籤key使用一個域名的方向符號。參考下面的指導方針去命名你的key:
-
所有(第三方)工具都應該在它們的key加上作者使用的域名反轉符號作爲前綴。;例如,
com.example.some-label
。 -
com.docker.*
,io.docker.*
和org.dockerproject.*
命令空間爲Docker內部使用而保留。 -
Keys 因該只包含小寫字母、數字、點和破折號(例如,
[a-z0-9-.]
)。 -
Keys 應該以一個阿拉伯數字開始和結束命名。
-
Keys 不應該包含連續的點或破折號。
-
Keys 不應該使用爲CLI保留的命名空間(點)。也沒有必要在命令行上使用複雜的命令空間。
這些指導方針,Docker沒有強制全部遵循。但是,不遵循上述的方針可能會導致你的標籤衝突而添加失敗。如果你構建一個使用標籤的工具,你應該使用爲你的標籤keys使用命令空間。
標籤保存數據的結構
標籤紙可以包含任何可以被保存爲字符串的值。例如,這個JSON:
{
"Description": "A containerized foobar",
"Usage": "docker run --rm example/foobar [args]",
"License": "GPL",
"Version": "0.0.1-beta",
"aBoolean": true,
"aNumber" : 0.01234,
"aNestedArray": ["a", "b", "c"]
}
你可以通過字符串序列化,將標籤保存成這樣的結構:
LABEL com.example.image-specs="{\"Description\":\"A containerized foobar\",\"Usage\":\"docker run --rm example\\/foobar [args]\",\"License\":\"GPL\",\"Version\":\"0.0.1-beta\",\"aBoolean\":true,\"aNumber\":0.01234,\"aNestedArray\":[\"a\",\"b\",\"c\"]}"
當你保存結構化的數據標籤是,Docker會把這個數據當做成一個“常規”的字符串。這意味着Docker對基於結構體數據內屬性的查詢(過濾)無能爲力。如果你的工具需要基於內部屬性的過濾,這個就需要工具自己實現這個部分功能。
使用 LABEL
指令爲鏡像添加標籤
添加標籤到一個鏡像裏:
LABEL [<namespace>.]<key>[=<value>] ...
LABEL
指令可以爲鏡像添加一個標籤,且可以隨意設置它的值。當標籤包含一個空格字符時,要使用雙引號其它括起來或使用反斜槓。
LABEL vendor=ACME\ Incorporated
LABEL com.example.version.is-beta
LABEL com.example.version="0.0.1-beta"
LABEL com.example.release-date="2015-02-12"
在單條的 LABEL
指令裏允許設置多個標籤:
LABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"
包裝符號反斜槓(\
),也可以用作延續標記:
LABEL vendor=ACME\ Incorporated \
com.example.is-beta \
com.example.version="0.0.1-beta" \
com.example.release-date="2015-02-12"
Docker建議你在單條的LABEL
指令中添加多個標籤。爲每個標籤使用條指令導致性能下降。因爲在Dockerfile文件裏,每個LABEL
指令就會創建一個新的鏡像層。
你可以通過docker inspect
命令查看標籤:
$ docker inspect 4fa6e0f0c678
...
"Labels": {
"vendor": "ACME Incorporated",
"com.example.is-beta": "",
"com.example.version": "0.0.1-beta",
"com.example.release-date": "2015-02-12"
}
...
# Inspect labels on container
$ docker inspect -f "{{json .Config.Labels }}" 4fa6e0f0c678
{"Vendor":"ACME Incorporated","com.example.is-beta":"","com.example.version":"0.0.1-beta","com.example.release-date":"2015-02-12"}
# Inspect labels on images
$ docker inspect -f "{{json .ContainerConfig.Labels }}" myimage
基於標籤的查詢
標籤除了可以保存之外,你還可以利用它過濾鏡像和容器。列出所用 com.example.is-beta
標籤是的且正在運行的容器:
# List all running containers that have a `com.example.is-beta` label
$ docker ps --filter "label=com.example.is-beta"
列出所有包含color
/ blue
的標籤且正在運行的容器:
$ docker ps --filter "label=color=blue"
列出所有包含 vendor
ACME
的鏡像:
$ docker images --filter "label=vendor=ACME"
守護進程標籤
docker daemon \
--dns 8.8.8.8 \
--dns 8.8.4.4 \
-H unix:///var/run/docker.sock \
--label com.example.environment="production" \
--label com.example.storage="ssd"
這些標籤應用到守護進程的元數據會被包含在docker info
命令的輸出裏:
docker -D info
Containers: 12
Images: 672
Storage Driver: aufs
Root Dir: /var/lib/docker/aufs
Backing Filesystem: extfs
Dirs: 697
Execution Driver: native-0.2
Logging Driver: json-file
Kernel Version: 3.13.0-32-generic
Operating System: Ubuntu 14.04.1 LTS
CPUs: 1
Total Memory: 994.1 MiB
Name: docker.example.com
ID: RC3P:JTCT:32YS:XYSB:YUBG:VFED:AAJZ:W3YW:76XO:D7NN:TEVU:UCRW
Debug mode (server): false
Debug mode (client): true
File Descriptors: 11
Goroutines: 14
EventsListeners: 0
Init Path: /usr/bin/docker
Docker Root Dir: /var/lib/docker
WARNING: No swap limit support
Labels:
com.example.environment=production
com.example.storage=ssd