Basis van cloud en containers

FROM alpine
COPY data.tar.gz /tmp/
RUN tar -xzf /tmp/data.tar.gz -C /opt && rm /tmp/data.tar.gz

Om een archief van 500 MB, data.tar.gz, uit te pakken, is met het bovenstaande Dockerfile een image gebouwd. Hoewel het archief na het uitpakken in dezelfde RUN werd verwijderd, bleef het image nog steeds groter, precies met de grootte van het archief. Welke combinatie van oorzaak en oplossing is het meest geschikt?

  1. ADe rm na && wordt tijdens de build niet uitgevoerd. Schrijf de rm als een aparte RUN-instructie
  2. BVerwijderde bestanden blijven als buildcache in het image. Bouw opnieuw met --no-cache bij docker build
  3. CHet archief blijft in de laag die door de COPY-instructie is gemaakt. Gebruik een multi-stage build en kopieer alleen de uitgepakte bestanden naar het uiteindelijke image
Antwoord en toelichting tonen

Antwoord: C. Het archief blijft in de laag die door de COPY-instructie is gemaakt. Gebruik een multi-stage build en kopieer alleen de uitgepakte bestanden naar het uiteindelijke image

Elke instructie in een Dockerfile die het bestandssysteem wijzigt (zoals COPY of RUN), wordt één laag, en een image is de stapel van die lagen. Het verwijderen van een bestand in een latere laag legt alleen een verwijdermarkering vast in de bovenste laag; het archief van 500 MB dat in de COPY-laag terechtkwam, blijft dus in het image. Met een multi-stage build die in een andere stage uitpakt en alleen de uitgepakte bestanden met COPY --from naar de laatste stage haalt, zit het archief niet in het uiteindelijke image. Downloaden, uitpakken en verwijderen binnen één RUN is een andere aanpak, maar die werkt niet voor een bestand dat met COPY is binnengehaald.

Dit onderwerp oefenen Naar de onderwerppagina

Meer vragen over Basis van cloud en containers

  1. Er zijn vijf images die elk een eigen laag van 30 MB stapelen op hetzelfde basisimage (120 MB). Compressie van de lagen en de grootte van metadata worden verwaarloosd. Hoeveel schijfruimte gebruiken de images als alle vijf naar één server worden gehaald (pull)?
  2. Welke combinatie van de opdracht die bij het bouwen van het image met docker build wordt uitgevoerd en de opdracht die bij het starten van een container met docker run wordt uitgevoerd, is voor het bovenstaande Dockerfile juist?
  3. Een image met de naam pinger, gebouwd uit het bovenstaande Dockerfile, wordt gestart met docker run pinger example.com. Welke opdracht wordt in de container uitgevoerd?
  4. Met de bovenstaande opdracht wordt een container gestart uit het image nginx, een webserver die op poort 80 luistert. Het IP-adres van de host is 192.0.2.10, en er zijn geen beperkingen zoals een firewall. Welke URL is juist om deze webserver te bereiken vanuit een browser op een andere pc in hetzelfde netwerk?
  5. Het bovenstaande Dockerfile (B) is gemaakt uit Dockerfile (A), waarin RUN npm ci na COPY . . stond, door de volgorde zo te veranderen dat eerst alleen de bestanden met de afhankelijkheden worden gekopieerd. npm ci duurt 120 seconden, npm run build 30 seconden en COPY . . 2 seconden; de tijd van de andere instructies is verwaarloosbaar. Het image wordt 20 keer per dag opnieuw gebouwd nadat alleen de broncode onder src is gewijzigd (package.json en package-lock.json blijven ongewijzigd). Hoeveel korter is de totale buildtijd per dag met B dan met A, als de cache van de vorige build kan worden gebruikt?