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

Gol*_*den 210 tags docker

假设我有一个我想要标记的图像0.10.24(在我的例子中,它是一个包含Node.js 0.10.24的图像).我使用Dockerfile构建该图像并执行docker build并使用-t参数提供标记.

我希望有一天我会有该图像的其他版本,所以我将重新运行该过程,只需使用另一个标记名称.

到现在为止还挺好.这很好,很好,一切都很好.

但是,这就是问题开始的地方,我还希望latest另外还有最新的图像标记广告.所以我想我需要给同一个图像赋予两个名字.

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

Tom*_*mmy 217

构建映像时可以有多个标记:

$ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .
Run Code Online (Sandbox Code Playgroud)

参考:https://docs.docker.com/engine/reference/commandline/build/#tag-image-t

  • 你也可以省略`:latest`部分,因为这是默认的:`docker build -t whenry/fedora-jboss -t whenry/fedora-jboss:v2.1 .` (16认同)

cre*_*ack 152

获得图像后,即可使用

$ docker tag <image> <newName>/<repoName>:<tagName>
Run Code Online (Sandbox Code Playgroud)
  1. 使用creack/node:latest构建和标记图像

    $ ID=$(docker build -q -t creack/node .)
    
    Run Code Online (Sandbox Code Playgroud)
  2. 添加新标签

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

    $ docker tag $ID creack/node:latest
    
    Run Code Online (Sandbox Code Playgroud)

  • 构建日志应该在stderr上,你可以在github上打开一个bug报告.否则,使用-t构建时,可以直接使用给定标记并完全丢弃图像ID.在我的例子中,第一行产生一个图像`creack/node:latest`,然后你可以用`docker tag creack/node标记它:最新的creack/node:0.10.24` (13认同)
  • 这似乎不再起作用了?build命令不返回图像id,ID包含整个构建日志 (4认同)
  • 使用:ID = $(docker build -q -t myrepo/myname:mytag.)."-q"表示只将ID写入stdout.您应该始终指定一个标记,就好像您不会使用标记'latest',即使您正在构建旧分支. (3认同)
  • 为了使最新的标签正常工作,您可能需要执行`docker tag -f $ID creack/node:latest` 以强制使用最新的标签(以防之前的图像已经是最新的) (2认同)

小智 34

这是我的bash脚本

docker build -t ${IMAGE}:${VERSION} .
docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest
Run Code Online (Sandbox Code Playgroud)

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

docker rmi $(docker images | grep "^<none>" | awk "{print $3}")
Run Code Online (Sandbox Code Playgroud)

链接

要么

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

要么

清理命令:

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

docker system prune
Run Code Online (Sandbox Code Playgroud)

或单独:

docker container prune
docker image prune
docker network prune
docker volume prune
Run Code Online (Sandbox Code Playgroud)

  • “docker tag”中不再存在“-f”选项。用法只是 `docker tag IMAGE[:TAG] IMAGE[:TAG]` (2认同)

Aar*_*lla 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
Run Code Online (Sandbox Code Playgroud)


Shu*_*mar 9

在构建命令期间为 docker 文件添加标签:

docker build -t image_name:tag_name .
Run Code Online (Sandbox Code Playgroud)

否则它会latest自动为你的 docker 镜像添加标签。


Pie*_*hac 8

只需从以下位置获取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
Run Code Online (Sandbox Code Playgroud)

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


Ton*_*ony 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
Run Code Online (Sandbox Code Playgroud)