2014-02-27 44 views
139

假設我有一個圖像,我想標記爲0.10.24(在我的情況下,它是一個包含Node.js 0.10.24的圖像)。我使用Dockerfile構建了該映像,並執行了docker build並使用參數-t提供了一個標記。如何在Docker中創建命名和最新的標籤?

我希望有一天我會有該圖像的其他版本,所以我將重新運行該過程,只是使用另一個標籤名稱。

到目前爲止,一切都很好。這工作很好,很好,一切都很好。

但是,這是問題開始的地方,我也希望總是有最新的圖像標記廣告latest另外。所以我想我需要給這個相同的圖像兩個名字。

我該怎麼做?我真的需要重新運行docker build再次完全相同的版本,但這次使用另一個標籤,是否有更好的選擇?

+0

相關問題:http://stackoverflow.com/questions/21928780/create-multiple-tag-docker-圖片 –

回答

127

一旦你有你的形象,你可以使用

$ docker tag <image> <newName>/<repoName>:<tagName>

1.建立和標記,creack /節點中的圖象:最新

$ 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包含整個構建日誌 –

+13

構建日誌應該在stderr上,您可以在github上打開bugreport。否則,當您使用-t編譯時,您可以直接使用給定的標記並丟棄圖像ID。在我的例子中,第一行生成一個圖像'creack/node:latest',然後你可以用'docker tag creack/node:最新的creack/node:0.10.24'來標記它' – creack

+0

這可以很好地用''' REV = $(hg identify --num)''' – analytik

18

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 
+0

或者你可以在'[這個答案](http://stackoverflow.com/a/22081272/884640) – hangtwenty

23

這裏是我的bash腳本

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

然後,您可以刪除未經標記的圖像,如果你有

docker rmi $(docker images | grep "^<none>" | awk "{print $3}") 
重建同一版本

link

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

清理命令:作爲搬運工1.13介紹清理命令。要刪除所有未使用的容器,圖像,網絡和卷:

docker system prune

或單獨:

docker container prune

docker image prune

docker network prune

docker volume prune

+0

中提到''''''''''''''''''''''在我的機器上(Ubuntu 14。04)'awk'{print $ 3}''但不是'awk'{print $ 3}「'因此我使用的命令是'docker rmi $(docker images -a | grep」^ |'awk'{print $ 3 }')' – grim

+1

''-f'選項不再存在於'docker標記'中。用法就是'docker tag IMAGE [:TAG] IMAGE [:TAG]' – jwadsack

+0

@ 2Fast2BCn:假設你在'docker build&docker run'後也需要'docker push',你用':latest'還是'$ {VERSION}'? –

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 
6

只是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或日誌文件。

相關問題