如何在Docker中创建命名和最新标签?


241

假设我有一个图像要标记为0.10.24(在我的情况下,这是一个包含Node.js 0.10.24的图像)。我使用Dockerfile构建了该映像,然后执行docker build并通过使用-t参数提供了标记。

我希望有一天我将拥有该图像的其他版本,因此我将使用另一个标签名称重新运行该过程。

到目前为止,一切都很好。这很好而且很好,一切都很好。

但是,这是问题开始的地方,我还希望始终另外拥有最新的图像标记广告latest。所以我想我需要给同一张图片加上两个名称。

我该怎么做呢?我是否真的需要再次docker build在完全相同的版本上运行,但是这次使用另一个标签,是否有更好的选择?


Answers:



161

有了图像后,就可以使用

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. 使用creack / node:latest构建并标记图像

    $ ID=$(docker build -q -t creack/node .)
    
  2. 新增标签

    $ docker tag $ID creack/node:0.10.24
    
  3. 您可以使用它并从构建中跳过-t部分

    $ docker tag $ID creack/node:latest
    

4
这似乎不再起作用了吗?build命令不返回图像ID,ID包含整个构建日志
Nicolas Mommaerts 2014年

14
构建日志应该在stderr上,您可以在github上打开错误报告。否则,当您使用-t构建时,可以直接使用给定的标记并完全丢弃图像ID。在我的示例中,第一行生成一个图像creack/node:latest,然后您可以用docker tag creack/node:latest creack/node:0.10.24
creack

这有类似效果很好REV=$(hg identify --num)
ANALYTIK

2
为了使最新标签正常工作,您可能需要这样做docker tag -f $ID creack/node:latest以强制使用最新标签(如果先前的图像已经是最新标签)
treaz 2015年

4
使用:ID = $(docker build -q -t myrepo / myname:mytag。)“ -q”表示仅将ID写入标准输出。您应该始终指定一个标签,就像您不使用标签“ latest”一样,即使您正在构建旧的分支。
David Roussel

44

这是我的bash脚本

docker build -t ${IMAGE}:${VERSION} .
docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest

如果使用以下命令重建了相同版本,则可以删除未标记的图像

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")

链接

要么

docker rmi $(docker images | grep "^<none>" | tr -s " " | cut -d' ' -f3 | tr '\n' ' ')

要么

清理命令

Docker 1.13引入了清理命令。要删除所有未使用的容器,图像,网络和卷:

docker system prune

或单独:

docker container prune
docker image prune
docker network prune
docker volume prune

在我的机器上(Ubuntu 14.04)awk '{print $3}'可以正常工作,但是awk "{print $3}"我无法使用的命令是docker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
严峻的

1
-f选项在中不再存在docker tag。用法只是docker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsa​​ck

@ 2Fast2BCn:假设您还需要docker pushafter docker build & docker run,您是否按下:latest${VERSION}
伊丹·阿达尔

我猜你都可以推。反正它只会存储一次。
2Fast2BCn

19

ID=$(docker build -t creack/node .)对我不起作用,因为ID它将包含构建的输出。

所以我正在使用这个小的BASH脚本:

#!/bin/bash

set -o pipefail

IMAGE=...your image name...
VERSION=...the version...

docker build -t ${IMAGE}:${VERSION} . | tee build.log || exit 1
ID=$(tail -1 build.log | awk '{print $3;}')
docker tag $ID ${IMAGE}:latest

docker images | grep ${IMAGE}

docker run --rm ${IMAGE}:latest /opt/java7/bin/java -version

1
或者,你可以通过-q/ --quietbuild作为中提到的这个答案
driftcatcher

8

只需grep来自的IDdocker images

docker build -t creack/node:latest .
ID="$(docker images | grep 'creak/node' | head -n 1 | awk '{print $3}')"
docker tag "$ID" creack/node:0.10.24
docker tag "$ID" creack/node:latest

需求没有临时文件并提供完整的构建输出。您仍然可以将其重定向到/dev/null或日志文件。


5

亚伦答案的变化。使用不带临时文件的sed

#!/bin/bash
VERSION=1.0.0
IMAGE=company/image
ID=$(docker build  -t ${IMAGE}  .  | tail -1 | sed 's/.*Successfully built \(.*\)$/\1/')

docker tag ${ID} ${IMAGE}:${VERSION}
docker tag -f ${ID} ${IMAGE}:latest
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.