Bagaimana cara memeriksa apakah gambar Docker dengan tag tertentu ada secara lokal?

117

Saya ingin mencari tahu apakah gambar Docker dengan tag tertentu ada secara lokal. Saya baik-baik saja dengan menggunakan skrip bash jika klien Docker tidak dapat melakukan ini secara native.

Hanya untuk memberikan beberapa petunjuk untuk skrip bash potensial, hasil dari menjalankan docker imagesperintah mengembalikan yang berikut:

REPOSITORY                               TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
rabbitmq                                 latest              e8e654c05c91        5 weeks ago         143.5 MB
busybox                                  latest              8c2e06607696        6 weeks ago         2.433 MB
rabbitmq                                 3.4.4               a4fbaad9f996        11 weeks ago        131.5 MB
Johan
sumber

Jawaban:

159

Saya biasanya menguji hasil docker images -q(seperti dalam skrip ini ):

if [[ "$(docker images -q myimage:mytag 2> /dev/null)" == "" ]]; then
  # do something
fi

Tapi karena docker imageshanya mengambil REPOSITORYsebagai parameter, Anda perlu grep pada tag, tanpa menggunakan-q.

docker images mengambil tag sekarang (buruh pelabuhan 1.8+) [REPOSITORY[:TAG]]

Pendekatan lain yang disebutkan di bawah ini adalah dengan menggunakan buruh pelabuhan inspeksi .
Tetapi dengan buruh pelabuhan 17+, sintaks untuk gambar adalah: docker image inspect(pada gambar yang tidak ada, status keluarnya bukan-0 )

Seperti dicatat oleh iTayb di komentar :

  • The docker images -qMetode bisa benar-benar lambat pada mesin dengan banyak gambar. Dibutuhkan 44 detik untuk dijalankan pada mesin 6.500 gambar.
  • The docker image inspectsegera kembali.
VonC
sumber
1
Hmm tidak yakin apakah ini berfungsi untuk tag? Ketika saya melakukan "gambar buruh pelabuhan -q rabbitmq" ia mengembalikan "e8e654c05c91 dan a4fbaad9f996" tetapi jika saya melakukan "gambar buruh pelabuhan -q rabbitmq: 3.4.4" tidak ada yang dikembalikan meskipun tag tersebut ada.
Johan
@Johan Meskipun tag tersebut ada secara lokal?
VonC
@Johan Saya baru saja mengecek ulang, dan parameter gambar buruh pelabuhan memang hanya mengambil repo, bukan tag. Saya telah mengedit jawaban untuk mengusulkan solusi alternatif.
VonC
1
Terima kasih sepertinya berhasil. Tetapi mungkin Anda harus mengedit jawaban Anda dan menghapus ": mytag" dari "myimage: mytag" sebelum saya menerimanya?
Johan
untuk newbs: apa perbedaan antara gambar (myimage) dan tag (mytag)? mengapa myimage: mytag bukan hanya mytag?
Alexander Mills
37

Coba docker inspect, misalnya:

$ docker inspect --type=image treeder/hello.rb:nada
Error: No such image: treeder/hello.rb:nada
[]

Tetapi sekarang dengan gambar yang ada, Anda akan mendapatkan banyak informasi, misalnya:

$ docker inspect --type=image treeder/hello.rb:latest
[
{
    "Id": "85c5116a2835521de2c52f10ab5dda0ff002a4a12aa476c141aace9bc67f43ad",
    "Parent": "ecf63f5eb5e89e5974875da3998d72abc0d3d0e4ae2354887fffba037b356ad5",
    "Comment": "",
    "Created": "2015-09-23T22:06:38.86684783Z",
    ...
}
]

Dan itu dalam format json yang bagus.

Travis Reeder
sumber
6
Ini adalah jawaban yang paling bisa dituliskan.
Michael Cole
2
Memang, imagesdan psperintah selalu keluar dengan 0, dengan inspectsesederhana itu:docker inspect "${image_id}:${image_tag}" > /dev/null 2>&1 || echo "does not exist!"
Erik Dannenberg
docker inspectsangat bagus karena kode pengembalian bukan nol saat tidak ada gambar.
Cowlinator
Ini juga jauh lebih cepat docker images -q.
iTayb
26

tldr:

docker image inspect myimage:mytag

Dengan cara demonstrasi ...

berhasil, gambar yang ditemukan:

$ docker image pull busybox:latest
latest: Pulling from library/busybox
Digest: sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f
Status: Image is up to date for busybox:latest

$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
yes

kegagalan, gambar hilang:

$ docker image rm busybox:latest
Untagged: busybox:latest
Untagged: busybox@sha256:32f093055929dbc23dec4d03e09dfe971f5973a9ca5cf059cbfb644c206aa83f

$ docker image inspect busybox:latest >/dev/null 2>&1 && echo yes || echo no
no

Referensi:

https://docs.docker.com/engine/reference/commandline/image_inspect/

rubick
sumber
ini langsung, cepat dan kompatibel hingga masa depan. Saya akan tetap berpegang pada solusi ini.
MarAvFe
17

Anda dapat menggunakan seperti berikut:

[ ! -z $(docker images -q someimage:sometag) ] || echo "does not exist"

Atau:

[ -z $(docker images -q someimage:sometag) ] || echo "already exists"
Luís Bianchin
sumber
6
Tidak berfungsi, setidaknya pada macOS, nilai yang dikembalikan selalu 0.
Gabor Csardi
1
Kode tersebut benar dan berfungsi di linux. Satu-satunya hal yang saya tambahkan adalah kutipan ke perintah subkulit
Draiken
3

Dengan bantuan jawaban Vonc di atas saya membuat skrip bash berikut bernama check.sh:

#!/bin/bash
image_and_tag="$1"
image_and_tag_array=(${image_and_tag//:/ })
if [[ "$(docker images ${image_and_tag_array[0]} | grep ${image_and_tag_array[1]} 2> /dev/null)" != "" ]]; then
  echo "exists"
else
  echo "doesn't exist"
fi

Menggunakannya untuk gambar dan tag yang ada akan dicetak exists, misalnya:

./check.sh rabbitmq:3.4.4

Menggunakannya untuk gambar dan tag yang tidak ada akan dicetak doesn't exist, misalnya:

./check.sh rabbitmq:3.4.3
Johan
sumber
2

Menggunakan test

if test ! -z "$(docker images -q <name:tag>)"; then
  echo "Exist"
fi

atau dalam satu baris

test ! -z "$(docker images -q <name:tag>)" &&  echo exist
Alex Montoya
sumber
2

Jika Anda mencoba mencari gambar buruh pelabuhan dari registri buruh pelabuhan, saya kira cara termudah untuk memeriksa apakah gambar buruh pelabuhan hadir adalah dengan menggunakan layanan daftar Tag API REST Docker V2

Contoh:-

curl $CURLOPTS -H "Authorization: Bearer $token" "https://hub.docker.com:4443/v2/your-repo-name/tags/list"

jika hasil di atas mengembalikan 200Ok dengan daftar tag gambar, maka kita tahu bahwa gambar itu ada

{"name":"your-repo-name","tags":["1.0.0.1533677221","1.0.0.1533740305","1.0.0.1535659921","1.0.0.1535665433","latest"]}

lain jika Anda melihat sesuatu seperti

{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"your-repo-name"}}]} 

maka Anda tahu pasti bahwa gambar itu tidak ada.

Abhishek J
sumber
2

Dalam skrip bash saya melakukan ini untuk memeriksa apakah gambar ada dengan tag:

IMAGE_NAME="mysql:5.6"

if docker image ls -a "$IMAGE_NAME" | grep -Fq "$IMAGE_NAME" 1>/dev/null; then
echo "could found image $IMAGE_NAME..."
fi

Contoh script di atas memeriksa apakah gambar mysql dengan tag 5.6 ada. Jika Anda hanya ingin memeriksa apakah ada gambar mysql tanpa versi tertentu maka cukup berikan nama repositori tanpa tag seperti ini:

IMAGE_NAME="mysql"
Namik Hajiyev
sumber
0

Sedikit dari saya untuk pembaca yang sangat baik:

Membangun

#!/bin/bash -e
docker build -t smpp-gateway smpp
(if  [ $(docker ps -a | grep smpp-gateway | cut -d " " -f1) ]; then \
  echo $(docker rm -f smpp-gateway); \
else \
  echo OK; \
fi;);
docker run --restart always -d --network="host" --name smpp-gateway smpp-gateway:latest

Menonton

docker logs --tail 50 --follow --timestamps smpp-gateway

Lari

sudo docker exec -it \
$(sudo docker ps | grep "smpp-gateway:latest" | cut -d " " -f1) \
/bin/bash
Artur Mustafin
sumber
0

untuk nama tag tertentu

$ docker images  --filter reference='<REPOSITORY>:TAG'

untuk "like clause" tagname: my_image_tag -> start my_ima *

$ docker images  --filter reference='<REPOSITORY>:my_ima*'

Jika Anda ingin sesuatu "gambar" misalnya hapus semua gambar tag mulai "my_ima" coba ini

docker rmi -f $(docker images -q  --filter reference='myreponame:my_ima*')
gagak
sumber