/ február 20, 2018/ docker/ 0 comments

Minél kisebb egy lemezkép, annál könnyebben tudjuk másolni.

A docker 1.0 változat óta a COPY, ADD és RUN parancsok új réteget hoznak létre. Minél több réteg van, annál több helyet foglal. Tehát érdemes trükközni. Például a parancsokat egy sorba írni:

RUN apt-get update && apt-get install vim

Ha külön RUN paranccsal futtatnák a két parancsot, eggyel több réteget hozna létre, mint így. A rétegek olyanok, mint a git commit-ok. Egy réteg csak a változást tárolja az előző réteghez képest. Amikor letöltünk egy lemezképet, csak azok a rétegek töltődnek le, amik még nincsenek meg. Így időt spórolhatunk meg. A rétegek viszont helyet foglalnak.

A docker history <lemezképnév:verzió> parancs megmutatja, hogy hány rétegből áll a lemezképünk, illetve hogy mekkora helyet foglal.

1. Multistage docker build

Ha a dockerfile-ba a from után beírjuk, hogy as:

FROM node:8 as build

WORKDIR /app
COPY package.json index.js ./
RUN npm install

FROM node:8

COPY --from=build /app /
EXPOSE 3000
CMD ["index.js"]

akkor az első node:8-as rész csak egy réteg lesz, majd a –from=build résznél ezt másoljuk le. A build helyett bármilyen nevet adhatunk neki.

2. Distroless

A fenti példában például csak a nodejs-re lenne szükségünk, de egy teljes ubuntu kiadás van alatta. A Google kitalált valamit: https://github.com/GoogleCloudPlatform/distroless. Eltávolít mindent a lemezképből, kivéve az alkalmazásunkat. A dockerfile-unk:

FROM node:8 as build

WORKDIR /app
COPY package.json index.js ./
RUN npm install

FROM gcr.io/distroless/nodejs

COPY --from=build /app /
EXPOSE 3000
CMD ["index.js"]

Ezzel 600 Megabájtról 70 Megabájtra csökkentettük a lemezkép méretét! A módszer hátránya, hogy nehezebb hibát keresni, mert még egy bash-t sem tudunk elindítani. Előnye a helymegtakarítás és hogy egy támadó is kevesebb kért tud tenni ha nem állnak rendelkezésére a binárisok.

3. Alpine

Az Alpine egy minimalizált Linux kiadás.

FROM node:8 as build

WORKDIR /app
COPY package.json index.js ./
RUN npm install

FROM node:8-alpine

COPY --from=build /app /
EXPOSE 3000
CMD ["npm", "start"]

Meglepő módon így a lemezképünk mérete kisebb, mint distroless esetén.

Összegzésképpen: talán fejlesztésre az alpine-t célszerű használni, éles rendszeren pedig a distroless-t a biztonságossága miatt.

Leave a Comment