Kontejnery vám umožňují zabalit vaši aplikaci přenosným způsobem, který lze spustit v mnoha prostředích. Nejoblíbenější kontejnerovou platformou je Docker.
Tento tutoriál vysvětlí, jak využít mezipaměť sestavení Dockeru ve svůj prospěch.
Mezipaměť sestavení Docker
Vytváření obrázků by mělo být rychlé, efektivní a spolehlivé. Koncept obrázků Docker přichází s neměnnými vrstvami. Každý příkaz, který provedete, má za následek vytvoření nové vrstvy, která obsahuje změny ve srovnání s předchozí vrstvou.
Všechny dříve vytvořené vrstvy jsou uloženy v mezipaměti a lze je znovu použít. Pokud však vaše instalace závisí na externích zdrojích, může mezipaměť Dockeru způsobit problémy.
Jak využít mezipaměť sestavení Docker
Abychom porozuměli problémům Docker build-cache, pojďme vytvořit jednoduchou vlastní aplikaci nginx Docker. Před vytvořením obrazu vytvořte Dockerfile, který aktualizuje knihovny a přidá vlastní úvodní stránku:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>My Custom Startpage</body></html>' > /usr/share/nginx/html/index.html
Nyní můžete vytvořit image Docker:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e12... 5.8s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.6s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.1s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
[+] Building 11.3s (7/7) FINISHED
V tomto příkladu jsem kvůli čitelnosti odstranil nějaký výstup. Pokud vytvoříte obrázek poprvé, uvidíte, že to nějakou dobu trvá, v mém případě 11.3s
.
Jedním z dlouhých spouštěcích kroků je apt-get update && apt-get -y upgrade
v závislosti na tom, kolik závislostí je aktualizováno a jak rychlý je váš internet. Zkontroluje aktualizace balíčků v operačním systému a nainstaluje je, pokud jsou k dispozici.
Nyní jej spustíte znovu a budete mít prospěch z mezipaměti sestavení Docker:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> CACHED [3/3] RUN echo '<html><bod>My Custom Startpage... 0.0s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.1s (7/7) FINISHED
Tentokrát je sestavení obrazu velmi rychlé, protože dokáže znovu použít všechny dříve vytvořené obrazy. Když přizpůsobíte svou úvodní stránku v Dockerfile, uvidíte, jak je ovlivněno chování ukládání do mezipaměti:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
Nyní vytvořte obrázek znovu:
$ docker build -t my-custom-nginx .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1… 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 2.1s (7/7) FINISHED
Tentokrát pouze přestavěl poslední vrstvu, protože rozpoznal, že RUN
příkaz se změnil. Znovu však použil intenzivní 2. krok sestavení a neaktualizoval závislosti operačního systému.
Chování mezipaměti je inteligentní. Jakmile je třeba znovu sestavit 1 krok, každý následující krok se vytvoří znovu. Proto je dobré umístit často se měnící části na konec Dockerfile
znovu použít předchozí vrstvy sestavení.
Přesto možná budete chtít vynutit znovu sestavení vrstvy uložené v mezipaměti, abyste vynutili aktualizaci balíčku. Vynucení opětovného sestavení může být nezbytné, protože chcete mít svou aplikaci v bezpečí a používat nejnovější aktualizace, když jsou k dispozici.
Jak používat sestavení Dockeru --no-cache
Možnost
Zakázání mezipaměti sestavení může mít různé důvody. Obrázek můžete znovu sestavit ze základního obrázku bez použití vrstev uložených v mezipaměti pomocí --no-cache
možnost.
$ docker build -t my-custom-nginx .
=> CACHED [1/3] FROM docker.io/library/nginx:1.21.6@sha256:... 0.0s
=> [2/3] RUN apt-get update && apt-get -y upgrade 3.5s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.2s
=> exporting to image 0.1s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 5.5s (7/7) FINISHED
Byly vytvořeny a použity nové vrstvy. docker build
tentokrát spustí oba příkazy, což přichází s přístupem všechno nebo nic. Buď poskytnete --no-cache
možnost, která provede všechny příkazy, nebo uložíte do mezipaměti co nejvíce.
Jak používat argumenty Dockeru pro vynechání mezipaměti
Další možnost umožňuje poskytnout malý výchozí bod v Dockerfile. Svůj Dockerfile musíte upravit takto:
FROM nginx:1.21.6
# Update all packages
RUN apt-get update && apt-get -y upgrade
# Custom cache invalidation
ARG CACHEBUST=1
# Use a custom startpage
RUN echo '<html><bod>New Startpage</body></html>' > /usr/share/nginx/html/index.html
Přidáte CACHEBUST
argument do vašeho Dockerfile v umístění, kde chcete vynutit přestavbu. Nyní můžete vytvořit image Docker a poskytnout vždy jinou hodnotu, která způsobí opětovné spuštění všech následujících příkazů:
$ docker build -t my-custom-nginx --build-arg CACHEBUST=$(date +%s) .
=> [1/3] FROM docker.io/library/nginx:1.21.6@sha256:e1211ac1... 0.0s
=> CACHED [2/3] RUN apt-get update && apt-get -y upgrade 0.0s
=> [3/3] RUN echo '<html><bod>My Custom Startpage... 0.3s
=> exporting to image 0.0s
=> exporting layers 0.0s
=> writing image 0.0s
=> naming to docker.io/library/my-custom-nginx
Building 1.0s (7/7) FINISHED
Poskytnutím --build-arg CACHEBUST=$(date +%s)
, nastavíte parametr na vždy jinou hodnotu, která způsobí opětovné sestavení všech následujících vrstev.