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

如何在Docker中创建命名和最新标记?,docker,tags,Docker,Tags,假设我有一个图像,我想标记为0.10.24(在我的例子中,它是一个包含Node.js 0.10.24的图像)。我使用Dockerfile并执行docker build以及使用-t参数提供标记来构建该图像 我希望有一天我会有该图像的其他版本,因此我将重新运行该过程,只使用另一个标记名 到目前为止,一切顺利。这很好用,一切都很好 但是,这就是问题的开始,我还希望始终将最新的图像标记为adlatest。所以我想我需要给同一个图像取两个名字 我该怎么做?我真的需要在完全相同的版本上再次运行docker

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

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

到目前为止,一切顺利。这很好用,一切都很好

但是,这就是问题的开始,我还希望始终将最新的图像标记为ad
latest
。所以我想我需要给同一个图像取两个名字


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

一旦你有了图像,你可以使用

$ docker tag <image> <newName>/<repoName>:<tagName>
  • 添加新标记

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

    $ docker tag $ID creack/node:latest
    
  • 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
    
    这是我的bash脚本

    docker build -t ${IMAGE}:${VERSION} .
    docker tag ${IMAGE}:${VERSION} ${IMAGE}:latest
    
    如果使用重新生成相同版本的图像,则可以删除未标记的图像

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

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

    亚伦回答的变化。 在没有临时文件的情况下使用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
    

    只需从docker images中grep ID:

    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
    或日志文件

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

    $ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .
    

    参考资料:

    这似乎不再有效了?build命令不返回映像id,id包含整个构建日志。构建日志应该在stderr上,您可以在github上打开bugreport。否则,当您使用-t构建时,您可以直接使用给定的标记并完全丢弃图像id。在我的示例中,第一行生成一个图像
    creack/node:latest
    ,然后您可以使用
    docker-tag-creack/node:latest-creack/node:0.10.24
    对其进行标记,这与
    REV=$(hg-identifite--num)之类的东西很好地配合使用
    要使最新标记正常工作,您可能需要执行
    docker标记-f$ID creack/node:latest
    以强制使用最新标记(如果以前的图像已经是最新的),使用:ID=$(docker build-q-t myrepo/myname:mytag)。“-q”表示仅将ID写入标准输出。你应该总是指定一个标记,就像你不知道一样,即使你正在构建一个旧的分支,也会使用标记'latest'。相关问题:在我的机器上(Ubuntu14.04)
    awk'{print$3}'
    awk{print$3},所以我使用的命令是
    docker rmi$(docker images-a | grep“^ awk'{print$3}'))
    docker标签中不再存在
    -f
    选项。用法就是
    docker tag IMAGE[:tag]IMAGE[:tag]
    @2Fast2BCn:假设你在
    docker build&docker run
    之后也需要
    docker push
    ,你是用
    :latest
    还是
    ${VERSION}
    来推?我想你可以推这两个。无论如何,它只会存储一次。或者您可以将
    -q
    /
    -quiet
    传递到
    build
    ,如中所述,您也可以省略
    :latest
    部分,因为这是默认部分:
    docker build-t whenry/fedora jboss-t whenry/fedora jboss:v2.1。
    #!/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
    
    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
    
    $ docker build -t whenry/fedora-jboss:latest -t whenry/fedora-jboss:v2.1 .