3.0.2使用自定義的元數據

使用自定義的元數據

你可以通過標籤(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
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章