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.gzOm 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?
- ADe rm na && wordt tijdens de build niet uitgevoerd. Schrijf de rm als een aparte RUN-instructie
- BVerwijderde bestanden blijven als buildcache in het image. Bouw opnieuw met --no-cache bij docker build
- 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.