En hurtig introduktion til Docker-tags

Hvis du har arbejdet med Docker selv i et stykke tid, vil jeg vædde på, at du er stødt på tags. De ligner ofte "mit_billede_navn: 1", hvor delen efter tyktarmen er kendt som et tag. Tagget er ikke altid angivet, når du tagger billeder, men vi kommer til bunden af ​​det senere.

Lige siden jeg begyndte at bruge Docker, har jeg været meget forvirret over tags. Dokumentationen forklarer dem ikke så godt, og der er virkelig ingen grundige forklaringer om emnet. Derfor besluttede jeg at skrive dette indlæg.

Hvad er Docker-tags?

Så hvad er nøjagtigt Docker-tags? I enkle ord overfører Docker-tags nyttige oplysninger om en bestemt billedversion / -variant. De er aliasser til id af dit billede, der ofte se sådan ud: f1477ec11d12. Det er bare en måde at henvise til dit billede. En god analogi er, hvordan Git-tags henviser til en bestemt forpligtelse i din historie.

De to mest almindelige tilfælde, hvor tags kommer i spil, er:

  1. Når vi bygger et billede, bruger vi følgende kommando:
docker build -t username/image_name:tag_name .

Lad os prøve at pakke ud, hvad denne kommando gør lidt. Vi beder Docker-dæmonen om at hente den Docker-fil, der er til stede i den aktuelle mappe (det er hvad .i slutningen gør). Derefter beder vi Docker-dæmonen om at oprette billedet og give det det angivne tag. Hvis du kører docker images, skal du se et billede, hvis lager er username/image_nameog tag er tag_name.

username/image_name er ikke et obligatorisk format til angivelse af billedets navn. Det er bare en nyttig konvention for at undgå at tagge dit billede igen, når du skal skubbe det til en registreringsdatabase.

Dit billede kan navngives, hvad du vil. For det offentlige Docker-registreringsdatabase er du begrænset til et hierarki med to niveauer, mens du navngiver billeder. For eksempel kan dit billede ikke have navnet a/b/c:1.Denne begrænsning findes normalt ikke i private registre. Som tidligere nævnt er det ikke obligatorisk at specificere en tag_name.Vi ser snart, hvad der sker i den sag.

2. Mærkning eksplicit af et billede gennem tagkommandoen.

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

Denne kommando opretter bare et alias (en reference) med navnet på det, TARGET_IMAGE der refererer til SOURCE_IMAGE.Det er alt, hvad det gør. Det er som at tildele et eksisterende billede et andet navn for at henvise til det. Bemærk, hvordan tagget også er angivet som valgfrit af [:TAG].

Hvad sker der, når du ikke angiver et tag?

Okay, lad os nu afdække, hvad der sker, når du ikke angiver et tag, mens du tagger et billede. Det er her latestmærket kommer ind i billedet. Hver gang et billede er tagget uden et eksplicit tag, får det latest tagget som standard. Det er et uheldigt navngivningsvalg, der forårsager en masse forvirring. Men jeg kan godt lide at tænke på det som standardmærket, der gives til billeder, når du ikke angiver et.

En masse forvirring omkring latestskyldes på grund af forventningen om, at det er den nyeste version af billedet, især i Dockerfiles. Lad os overveje de forskellige scenarier med et eksempel:

Scenarie 1:

Antag at følgende udsagn er til stede i vores Dockerfile:

FROM debian

Da vi ikke specificerede noget tag, tilføjer Docker latesttagget og prøver at trække billedet debian:latest.

Scenarie 2:

FROM debian:9.3

Da tagget udtrykkeligt er nævnt her, trækker Docker Debian-billedet mærket 9.3

En anden ting at huske på er, at der ikke er nogen regel, der siger, at et billede kun skal have et tag. Et billede kan have flere tags, og de bruges normalt til at specificere større og mindre versioner. Overvej for eksempel dette:

På tidspunktet for at skrive dette indlæg, det latesttag for Debian billedet peger på 9.3frigivelse og den 9udgivelse. Dette vil sandsynligvis ændre sig i fremtiden, når den store eller mindre version bliver bumpet for billedet.

Bemærk, at tags, der bruges til semantisk versionering, er en konvention, der følges, men tags blev ikke designet kun til det formål.

Afslutningsvis er det seneste ikke et specielt tag

Den vigtigste afhentning fra det, vi hidtil har dækket, er, at den seneste er ligesom ethvert andet mærke . Det påhviler udvikleren at tagge billederne korrekt, så det latestaltid peger på den seneste stabile udgivelse af billedet.

Derfor specificerer vi ikke eksplicit et tag i vores Dockerfiles, når vi trækker billeder, da vi måske ender med en helt anden version af basisbilledet end det, vi havde brugt før. Der er ingen garantier for, om det er en større bump eller mindre bump. Selv en gammel udgivelse kan mærkes som latest.

PS Hvis du fandt misforståelser / fejl i indlægget, er du velkommen til at tweet til mig @ScribbingOn.

Tak til Jérôme Petazzoni for at hjælpe mig med at forstå noget af dette.