3.0.2使用自定义的元数据

来源:互联网 发布:tomat端口号被占用 编辑:程序博客网 时间:2024/04/30 07:34

使用自定义的元数据

你可以通过标签(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\ IncorporatedLABEL com.example.version.is-betaLABEL 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 infoContainers: 12Images: 672Storage Driver: aufs Root Dir: /var/lib/docker/aufs Backing Filesystem: extfs Dirs: 697Execution Driver: native-0.2Logging Driver: json-fileKernel Version: 3.13.0-32-genericOperating System: Ubuntu 14.04.1 LTSCPUs: 1Total Memory: 994.1 MiBName: docker.example.comID: RC3P:JTCT:32YS:XYSB:YUBG:VFED:AAJZ:W3YW:76XO:D7NN:TEVU:UCRWDebug mode (server): falseDebug mode (client): trueFile Descriptors: 11Goroutines: 14EventsListeners: 0Init Path: /usr/bin/dockerDocker Root Dir: /var/lib/dockerWARNING: No swap limit supportLabels: com.example.environment=production com.example.storage=ssd
来源: <https://docs.docker.com/userguide/labels-custom-metadata/>
 
0 0
原创粉丝点击