Apply custom metadata

你能夠用過LABEL把元數據應用到你的鏡像,容器或者是守護進程中。元數據能夠服務於普遍的用途。使用標籤能夠給鏡像添加註釋或者是許可信息,還能夠用來標誌你的主機docker

標籤是<key> / <value>鍵值對,Docker以字符串的方式存儲標籤。你能夠指定多個標籤可是每個<key> / <value>必須不一樣防止對已經存在的鍵值對覆蓋。若是你給同一個key指定了多個不一樣的值,新的值會把以前的值覆蓋掉。記住,對於相同的key,Docker只會應用你提供的最後一個值。shell

注意:Docker1.4.1以後的版本才支持daemon-labels,對標籤和容器的標籤支持是1.6.0中的新特性。ide

Label keys (namespaces)

標籤的,(也就是命名空間)工具

Docker對你建立的標籤中的鍵沒有什麼硬性的限制,可是簡單的鍵也有可能衝突。例如,你經過architecture標籤來給你的鏡像分類:spa

languageLABEL architecture="amd64"
LABEL architecture="ARMv7"

並且用戶也能夠經過不一樣風格的標籤來給鏡像打標籤:unix

languageLABEL architecture="Art Nouveau"

爲了防止命名衝突,Docker的命名空間標籤鍵使用反向域名表示。參考下面來命名你的鍵:code

  • 全部的(第三方)工具都用反向域名前綴+標籤的方式來命名,這個反向域名要和工具做者提供的域名一致,如com.example.some-labelcom.example.some-auther="root"
  • com.docker.*, io.docker.*com.dockerproject.*保留給Docker內部使用
  • 鍵只能是小寫字母,數字,點和-表示,及[a-z0-9-.]
  • 鍵名的開始和結束只能是字母和數字
  • 不能包含連續的-和點
  • 沒有名稱空間的標籤保留給CLI,這就容許最終用戶給容器和鏡像添加元數據而沒必要在終端輸入繁瑣的命令

上面列舉的都是準則且Docker嚴格遵照執行。若是你沒有遵照這些準則有可能致使標籤名的衝突。若是恰巧你也在使用標籤構建工具的話,趕快爲你的標籤和鍵使用名稱空間吧orm

Store structured data in labels

在標籤中存儲結構化數據dns

標籤中的值能夠包含任何能被存儲爲字符串的值,例以下面的JSON格式的數據:進程

shell{
    "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"]
}

要想把這個結構存儲在標籤中,首先你要把它序列化爲字符串:

languageLABEL 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自己並不提供基於嵌套屬性的查詢(過濾器)。若是你的工具須要經過嵌套屬性來過濾,那麼你的工具自己要實現這個功能,二不要讓Docker去作。

Add labels to images; the LABEL instruction

使用LABEL指令給鏡像添加標籤

languageLABEL [<namespace>.]<key>[=<value>] ...

LABEL指令用來給鏡像添加標籤,可選擇設置它的值。對於使用空格的標籤,要用雙引號或者反斜槓
e.g.

languageLABEL 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下設置多個
e.g.

languageLABEL com.example.version="0.0.1-beta" com.example.release-date="2015-02-12"

Docker容許使用反斜槓\,將1行指令分割爲多個行

languageLABEL 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指令都會產生1個鏡像層(怒了,這個解釋直達本質啊)!!!

咱們可使用docker inspect來查看鏡像或者容器的標籤

Query labels

查詢標籤

標籤除了能夠用來存儲元數據,還能夠用來過濾鏡像和容器。下面的命令將會列出全部包含com.example.is-beta標籤而且運行這的容器:

languagedocker ps --filter "label=com.example.is-beta"

color標籤且值爲blue的運行中的容器

languagedocker ps --filter "label=color=blue"

包含vendorACME的鏡像

languagedocker images --filter "label=vendor=ACME"

Daemon labels

守護標籤

docker info這條命令的解釋是:Display system-wide information(顯示所有信息)
下面是我電腦上的結果:

languageadolph@geek:~$ docker info
Containers: 7
Images: 44
Storage Driver: aufs
 Root Dir: /var/lib/docker/aufs
 Backing Filesystem: extfs
 Dirs: 58
 Dirperm1 Supported: false
Execution Driver: native-0.2
Kernel Version: 3.13.0-52-generic
Operating System: Ubuntu 14.04.2 LTS
CPUs: 4
Total Memory: 7.687 GiB
Name: geek
ID: HGR7:UGWW:VQVV:WYMF:CSEE:KJ4C:QS4U:IRIU:LREB:M4YC:GDJY:YPI5
Username: adolphlwq
Registry: [https://index.docker.io/v1/]
WARNING: No swap limit support

能夠看出裏面主要是關於Docker daemon的信息,這裏並無關於它的標籤信息。可是咱們能夠經過``docker -d label=value`的方式給Docker daemon自己添加標籤:

languagedocker -d \
  --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"
相關文章
相關標籤/搜索