Dacă ați lucrat cu Docker chiar și pentru o vreme, pariez că ați dat peste etichete. Adesea arată ca „numele_imaginea_meu: 1”, unde partea de după colon este cunoscută sub numele de etichetă. Eticheta nu este întotdeauna specificată la etichetarea imaginilor, dar vom ajunge mai jos la aceasta.

De când am început să folosesc Docker, am fost foarte confuz cu privire la etichete. Documentația nu le explică foarte bine și chiar nu există explicații amănunțite pe această temă. De aceea am decis să scriu această postare.

Ce sunt etichetele Docker?

Deci, ce sunt exact etichetele Docker? În cuvinte simple, etichetele Docker transmit informații utile despre o anumită versiune / variantă a imaginii. Acestea sunt aliasuri la ID-ul imaginii dvs. care arată adesea astfel: f1477ec11d12. Este doar un mod de a te referi la imaginea ta. O bună analogie este modul în care etichetele Git se referă la un anumit commit din istoria ta.

Cele mai frecvente două cazuri în care etichetele intră în joc sunt:

  1. Când construim o imagine, folosim următoarea comandă:
docker build -t username/image_name:tag_name .

Să încercăm să despachetăm puțin ce face această comandă. Îi spunem demonului Docker să aducă fișierul Docker prezent în directorul curent (asta este ceea ce . la sfârșit face). Apoi, îi spunem demonului Docker să construiască imaginea și să-i dea eticheta specificată. Dacă alergi docker images, ar trebui să vedeți o imagine al cărei depozit este username/image_name iar eticheta este tag_name.

username/image_name nu este un format obligatoriu pentru specificarea numelui imaginii. Este doar o convenție utilă pentru a evita etichetarea imaginii din nou atunci când trebuie să o împingeți într-un registru.

Imaginea dvs. poate fi numită orice doriți. Pentru registrul public Docker, sunteți limitat la o ierarhie pe două niveluri în timpul denumirii imaginilor. De exemplu, imaginea dvs. nu poate avea numele a/b/c:1. Această restricție de obicei nu există în registrele private. După cum sa menționat anterior, nu este obligatoriu să specificați un tag_name. Vom vedea ce se întâmplă în acest caz în curând.

2. Etichetarea explicită a unei imagini prin intermediul tag comanda.

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

Această comandă creează doar un alias (o referință) cu numele fișierului TARGET_IMAGE care se referă la SOURCE_IMAGE. Atât face. Este ca și cum ai atribui unei imagini existente un alt nume pentru a se referi la aceasta. Observați cum eticheta este specificată ca opțională și aici, de către [:TAG] .

Ce se întâmplă atunci când nu specificați o etichetă?

Bine, acum să descoperim ce se întâmplă atunci când nu specificați o etichetă în timp ce etichetați o imagine. Acesta este locul unde latest eticheta vine în imagine. Ori de câte ori o imagine este etichetată fără o etichetă explicită, i se dă latest eticheta implicită. Este o alegere nefericită de numire care provoacă o mulțime de confuzie. Dar îmi place să mă gândesc la asta ca la etichetă implicită care este dat imaginilor atunci când nu specificați una.

O mulțime de confuzie în jur latest este cauzată de așteptarea că este cea mai recentă versiune a imaginii, în special în Dockerfiles. Să luăm în considerare diferitele scenarii cu un exemplu:

Scenariul 1:

Să presupunem că următoarea afirmație este prezentă în fișierul nostru Docker:

FROM debian

Deoarece nu am specificat nicio etichetă, Docker va adăuga fișierul latest etichetați și încercați să trageți imaginea debian:latest .

Scenariul 2:

FROM debian:9.3

Deoarece eticheta este menționată în mod explicit aici, Docker va extrage imaginea Debian etichetată 9.3

Un alt lucru de reținut este că nu există nicio regulă care să prevadă că o imagine trebuie să aibă o singură etichetă. O imagine poate avea mai multe etichete și sunt de obicei utilizate pentru a specifica versiuni majore și minore. De exemplu, luați în considerare acest lucru:

O introducere rapida la etichetele Docker
Pagina Docker Hub pentru Debian

În momentul redactării acestui post, latest eticheta pentru imaginea Debian indică spre 9.3 eliberare și 9 eliberare. Acest lucru se va schimba cel mai probabil în viitor ori de câte ori versiunea majoră sau minoră este blocată pentru imagine.

Vă rugăm să rețineți că etichetele utilizate pentru versiunile semantice sunt o convenție care a fost urmată, dar etichetele nu au fost proiectate doar pentru acel scop.

În concluzie, ultima nu este o etichetă specială

Principala plată din ceea ce am acoperit până acum este că cel mai recent este la fel ca orice altă etichetă. Sarcina revine dezvoltatorului să eticheteze corect imaginile astfel încât latest indică întotdeauna cea mai recentă versiune stabilă a imaginii.

Prin urmare, nu specificăm în mod explicit o etichetă în fișierele noastre Docker atunci când extragem imagini, deoarece am putea ajunge cu o versiune complet diferită a imaginii de bază decât cea pe care o folosisem anterior. Nu există garanții cu privire la faptul dacă va fi o lovitură majoră sau o lovitură minoră. Chiar și o versiune veche poate fi etichetată ca latest.

PS Dacă ați găsit vreo concepție greșită / erori în postare, vă rugăm să nu ezitați să-mi trimiteți un tweet @ScribbingOn.

Mulțumită Jérôme Petazzoni pentru că m-a ajutat să înțeleg ceva din toate acestea.