Docker'da adlandırılmış ve en son etiket nasıl oluşturulur?


241

Ben etiketlemek istediğiniz 0.10.24bir görüntü var varsayalım (benim durumumda Node.js 0.10.24 içeren bir görüntü). Bir Dockerfile kullanarak ve yürütmek docker buildve -tparametre kullanarak bir etiket sağlayarak bu görüntü inşa .

Bir gün bu görüntünün ek sürümlerine sahip olacağımı umuyorum, bu yüzden işlemi sadece başka bir etiket adıyla tekrar çalıştıracağım.

Çok uzak çok iyi. Bu harika ve güzel çalışıyor ve her şey yolunda.

Ancak, sorunların başladığı yer burasıdır, ayrıca her zaman latestek olarak etiketlenmiş en yeni resme sahip olmak istiyorum . Bu yüzden sanırım aynı görüntüye iki isim vermem gerekiyor.

Bunu nasıl yaparım? Gerçekten docker buildaynı sürümde tekrar çalıştırmam gerekiyor mu , ancak bu sefer başka bir etiket kullan, daha iyi bir seçenek var mı?


Yanıtlar:



161

Görüntünüzü aldıktan sonra aşağıdakileri kullanabilirsiniz:

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Görüntüyü creack / node ile derleyin ve etiketleyin: latest

    $ ID=$(docker build -q -t creack/node .)
    
  2. Yeni bir etiket ekle

    $ docker tag $ID creack/node:0.10.24
    
  3. Bunu kullanabilir ve -t kısmını derlemeden atlayabilirsiniz.

    $ docker tag $ID creack/node:latest
    

4
Bu artık işe yaramıyor gibi görünüyor mu? Yapı komutu resim kimliğini döndürmez, kimlik tüm yapı günlüğünü içerir
Nicolas Mommaerts

14
Yapı günlüklerinin stderr'de olması gerekiyordu, github'da bir hata raporu açabilirsiniz. Aksi takdirde, -t ile oluşturduğunuzda, verilen etiketi doğrudan kullanabilir ve resim kimliğini tamamen atabilirsiniz. creack/node:latestdocker tag creack/node:latest creack/node:0.10.24
Örneğimde

Bu gibi bir şeyle iyi çalışırREV=$(hg identify --num)
analytik

2
En son etiketin düzgün çalışmasını sağlamak için, muhtemelen docker tag -f $ID creack/node:latestetiketlemeyi en son
sürümle

4
Kullanın: ID = $ (docker build -q -t myrepo / myname: mytag.). "-Q" yalnızca kimlik kodunun stdout'a yazıldığı anlamına gelir. Her zaman bir etiket belirtmelisiniz, sanki eski bir dal oluşturuyor olsanız bile 'en son' etiketi kullanılmaz.
David Roussel

44

İşte benim bash senaryom

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

Daha sonra aynı sürümü yeniden oluşturduysanız etiketsiz görüntüleri kaldırabilirsiniz

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

bağlantı

veya

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

veya

Temizleme komutları :

Docker 1.13, temizleme komutları sunar. Kullanılmayan tüm kapları, resimleri, ağları ve birimleri kaldırmak için:

docker system prune

veya ayrı ayrı:

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

Makinemde (Ubuntu 14.04) awk '{print $3}'çalışıyor ama öyle değil awk "{print $3}"ki kullandığım komutdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
Grim

1
-fseçeneği artık var docker tag. Kullanım sadecedocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack

@ 2Fast2BCn: Ayrıca gerek varsayarsak docker pushsonra docker build & docker runsizinle itiyorsun, :latestya ${VERSION}?
Idan Adar

Sanırım ikisini de itebilirsiniz. Yine de sadece bir kez saklayacaktır.
2Fast2BCn

19

ID=$(docker build -t creack/node .)IDderleme çıktı içerecektir beri benim için çalışmıyor .

Bu küçük BASH betiğini kullanıyorum:

#!/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
Ya da sadece geçebilir -q/ --quietiçin buildbelirtilen bu cevap
driftcatcher

8

Sadece kimliği grep dan docker 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

İhtiyaç hiçbir geçici dosya ve verir tam yapı çıktı . Yine de /dev/nullbir günlük dosyasına veya bir günlük dosyasına yönlendirebilirsiniz .


5

Aaron'un cevabının varyasyonu. Geçici dosyalar olmadan sed kullanma

#!/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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.