Bagaimana cara membuat tag bernama dan terbaru di Docker?

241

Misalkan saya memiliki gambar yang ingin saya tandai 0.10.24(dalam kasus saya ini adalah gambar yang mengandung Node.js 0.10.24). Saya membangun gambar itu menggunakan Dockerfile dan mengeksekusi docker builddan dengan memberikan tag menggunakan -tparameter.

Saya berharap bahwa suatu hari saya akan memiliki versi tambahan dari gambar itu, jadi saya akan menjalankan kembali prosesnya, hanya dengan nama tag lain.

Sejauh ini baik. Ini bekerja dengan baik dan bagus dan semuanya baik-baik saja.

Tapi, dan di sinilah masalah mulai, saya juga ingin selalu memiliki iklan gambar tag baru latesttambahan. Jadi saya kira saya harus memberikan dua nama ke gambar yang sama.

Bagaimana saya melakukan ini? Apakah saya benar-benar perlu menjalankan docker buildkembali versi yang sama persis, tetapi kali ini menggunakan tag lain, apakah ada opsi yang lebih baik?

Golo Roden
sumber
Pertanyaan terkait: stackoverflow.com/questions/21928780/…
Mark Butler

Jawaban:

161

Setelah Anda memiliki gambar Anda, Anda dapat menggunakannya

$ docker tag <image> <newName>/<repoName>:<tagName>
  1. Buat dan beri tag pada gambar dengan creack / node: terbaru

    $ ID=$(docker build -q -t creack/node .)
    
  2. Tambahkan tag baru

    $ docker tag $ID creack/node:0.10.24
    
  3. Anda bisa menggunakan ini dan melewati bagian -t dari build

    $ docker tag $ID creack/node:latest
    
creack
sumber
4
Ini sepertinya tidak berfungsi lagi? Perintah build tidak mengembalikan id gambar, ID berisi seluruh log pembangunan
Nicolas Mommaerts
14
Log bangunan seharusnya berada di stderr, Anda dapat membuka laporan bug di github. Jika tidak, ketika Anda membangun dengan -t, Anda dapat menggunakan secara langsung tag yang diberikan dan membuang sekaligus id gambar. Dalam contoh saya, baris pertama menghasilkan gambar creack/node:latest, Anda dapat menandainya dengandocker tag creack/node:latest creack/node:0.10.24
creack
Ini berfungsi baik dengan sesuatu sepertiREV=$(hg identify --num)
analytik
2
Agar tag terbaru berfungsi dengan baik, Anda mungkin ingin melakukannya docker tag -f $ID creack/node:latestuntuk memaksa pemberian tag dengan yang terbaru (seandainya gambar sebelumnya sudah terbaru)
treaz
4
Gunakan: ID = $ (build buruh pelabuhan -q -t myrepo / myname: mytag.). "-Q" berarti hanya ID yang ditulis ke stdout. Anda harus selalu menentukan tag, seolah-olah Anda tidak menggunakan tag 'terbaru', bahkan jika Anda sedang membangun cabang lama.
David Roussel
44

Ini skrip bash saya

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

Anda kemudian dapat menghapus gambar yang tidak ditandai jika Anda membuat ulang versi yang sama dengannya

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

tautan

atau

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

atau

Bersihkan perintah :

Docker 1.13 memperkenalkan perintah pembersihan. Untuk menghapus semua wadah, gambar, jaringan, dan volume yang tidak digunakan:

docker system prune

atau secara individual:

docker container prune
docker image prune
docker network prune
docker volume prune
2Fast2BCn
sumber
Di komputer saya (Ubuntu 14.04) awk '{print $3}'berfungsi tetapi tidak awk "{print $3}"begitu perintah yang saya gunakan adalahdocker rmi $(docker images -a | grep "^<none>" | awk '{print $3}')
grim
1
yang -fpilihan tidak ada lagi di docker tag. Penggunaan hanyadocker tag IMAGE[:TAG] IMAGE[:TAG]
jwadsack
@ 2Fast2BCn: Dengan asumsi Anda juga perlu docker pushsetelah docker build & docker run, apakah Anda mendorong dengan :latestatau ${VERSION}?
Idan Adar
Anda bisa mendorong keduanya, saya kira. Ini akan menyimpannya hanya sekali.
2Fast2BCn
19

ID=$(docker build -t creack/node .)tidak berfungsi untuk saya karena IDakan berisi output dari build.

JADI Saya menggunakan skrip BASH kecil ini:

#!/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
Aaron Digulla
sumber
1
Atau Anda hanya bisa lewat -q/ --quietuntuk buildsebagaimana disebutkan dalam jawaban ini
driftcatcher
8

Cukup ambil ID dari 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

Tidak perlu file sementara dan memberikan output build penuh . Anda masih dapat mengarahkan ulang ke /dev/nullatau file log.

Pierre-Alexis de Solminihac
sumber
5

Variasi jawaban Harun. Menggunakan sed tanpa file sementara

#!/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
Tony
sumber