จะสร้างแท็กที่ระบุชื่อและล่าสุดใน Docker ได้อย่างไร


241

สมมติว่าฉันมีภาพที่ฉันต้องการติดแท็กเป็น0.10.24(ในกรณีของฉันมันเป็นภาพที่มี Node.js 0.10.24) ฉันสร้างอิมเมจนั้นโดยใช้ Dockerfile และเรียกใช้งานdocker buildและจัดทำแท็กโดยใช้-tพารามิเตอร์

ฉันคาดหวังว่าวันหนึ่งฉันจะมีภาพเพิ่มเติมในเวอร์ชันนั้นดังนั้นฉันจะรันใหม่อีกครั้งโดยใช้ชื่อแท็กอื่น

จนถึงตอนนี้ดีมาก มันใช้งานได้ดีและดีและทั้งหมดเป็นอย่างดี

แต่และนี่คือที่ที่ปัญหาเริ่มต้นฉันยังต้องการให้มีการติดแท็กโฆษณารูปภาพล่าสุดlatestเสมอ ดังนั้นฉันคิดว่าฉันต้องให้ชื่อสองชื่อในภาพเดียวกัน

ฉันจะทำสิ่งนี้ได้อย่างไร ฉันจำเป็นต้องเปิดใช้docker buildงานเวอร์ชันเดิมซ้ำอีกครั้ง แต่คราวนี้ใช้แท็กอื่นมีตัวเลือกที่ดีกว่านี้หรือไม่


คำถามที่เกี่ยวข้อง: stackoverflow.com/questions/21928780/…
ทำเครื่องหมาย Butler

คำตอบ:


267

คุณสามารถมีหลายแท็กเมื่อสร้างภาพ:

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

การอ้างอิง: https://docs.docker.com/engine/reference/commandline/build/#tag-image-t


23
คุณยังสามารถละทิ้ง:latestส่วนนี้ได้เช่นเดียวกับค่าเริ่มต้น:docker build -t whenry/fedora-jboss -t whenry/fedora-jboss:v2.1 .
TemporalWolf

161

เมื่อคุณมีภาพคุณสามารถใช้

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. สร้างและแท็กรูปภาพด้วย creack / node: ล่าสุด

    $ 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

14
บันทึกการสร้างควรจะอยู่ใน stderr คุณสามารถเปิดรายงานข้อผิดพลาดบน github มิฉะนั้นเมื่อคุณสร้างด้วย -t คุณสามารถใช้แท็กที่กำหนดโดยตรงและทิ้งรหัสรูปภาพทั้งหมด ในตัวอย่างของฉันบรรทัดแรกสร้างภาพ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

4
ใช้: ID = $ (ตัวสร้างโครงสร้าง -q -t myrepo / myname: mytag.) "-q" หมายถึงเฉพาะ ID ที่เขียนไปยัง stdout คุณควรระบุแท็กเสมอราวกับว่าคุณไม่ได้ใช้แท็ก 'ล่าสุด' แม้ว่าคุณจะสร้างสาขาเก่าก็ตาม
David Roussel

44

นี่คือสคริปต์ทุบตีของฉัน

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' ' ')

หรือ

ล้างคำสั่ง :

นักเทียบท่า 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}')
grim

1
ตัวเลือกที่ไม่ได้อยู่ใน-f docker tagการใช้งานเป็นเพียงdocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack

@ 2Fast2BCn: สมมติว่าคุณจำเป็นต้องทำdocker pushหลังจากdocker build & docker runนั้นคุณกด:latestหรือ${VERSION}ไม่
Idan Adar

คุณสามารถผลักทั้งฉันเดา มันจะเก็บมันเพียงครั้งเดียวต่อไป
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/ --quietไปbuildตามที่กล่าวไว้ในคำตอบนี้
driftcatcher

8

เพียงgrep IDจาก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

ความต้องการไม่มีไฟล์ชั่วคราวและให้สร้างเอาท์พุทเต็มรูปแบบ คุณยังสามารถเปลี่ยนเส้นทางไปยัง/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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.