A Docker build környezete azokra a fájlokra és könyvtárakra utal, amelyek a futtatáskor a Docker motor számára elérhetőek lesznek docker build
. Bármi, ami nem szerepel a build környezetben, nem lesz elérhető az Ön parancsai számára Dockerfile
.
Ellenőriznie kell a használatát docker build
hogy kicsi legyen az építési környezet. A véletlen felesleges fájlok véletlenszerű beillesztése túl nagy összeállítási kontextust eredményezhet, ami hosszabb összeállításokat eredményez.
Mi az összeállítási kontextus?
Itt egy egyszerű docker build
parancs:
docker build . -t my-image:latest
Ez egy Docker képet épít a Dockerfile
megtalálható a munkakönyvtárban. A kapott képet a következő címkével látja el my-image:latest
, bár ez a részlet nem fontos az oktatóanyag számára.
A Dockerfile
, akkor valószínűleg használni fogja COPY
fájlok és mappák hozzáadásához a képhez:
FROM httpd:latest
COPY index.html /usr/local/apache2/htdocs/index.html
COPY css/ /usr/local/apache2/htdocs/css/
Ez a példa lemásolja a index.html
fájl és css
könyvtárat a tárolóba. Első pillantásra úgy néz ki, mint a COPY
utasítás egyszerűen egy utat jelöl, amely megoldódott a munkakönyvtárhoz képest.
Ez nem egészen így van. COPY
csak a build környezetben elérhető erőforrásokhoz férhet hozzá. Ebben a példában a build környezet a munkakönyvtár, így a benne található fájlok és mappák elérhetőek. Alapértelmezés szerint a Docker az átadott könyvtár tartalmát használja docker build
mint az építési kontextus.
Miért használják az összeállítási kontextust?
Az összeállítási kontextus azért fontos, mert lehet, hogy a Docker CLI és a Docker Engine nem ugyanazon a gépen fut. Amikor futsz docker build
, a CLI elküldi a fájlokat és mappákat építendő a Docker motorhoz. Ez a fájlok és mappák halmaza lesz az építési kontextus.
Ezenkívül nem minden összeállítási kontextus olyan egyszerű, mint a munkakönyvtár újrafelhasználása. A Docker a Git adattár URL-címeit is támogatja, mivel a megadott útvonal docker build
. Ebben az esetben a build-kontextus lesz a megadott lerakat tartalma.
A felépítési kontextus alapértelmezett „mindent tartalmaz” viselkedése sok kicsi lerakat számára megfelelő. A problémák nyilvánvalóvá válnak, ha olyan fájlokat ad hozzá a munkakönyvtárához, amelyeket nem a felhasználó használ Dockerfile
. Az olyan erőforrások, mint az előre épített bináris fájlok, a dokumentációs fájlok és a függőségi könyvtárak, még akkor is bekerülnek az összeállítás környezetébe, ha azok feleslegesek.
Túl sok eszköz beépítése az összeállítási kontextusba teljesítménycsökkenéssé válhat. Feleslegesen másol olyan fájlokat, amelyek soha nem lesznek használva. A lassulás különösen nyilvánvaló lesz, ha távoli Docker démonhoz csatlakozik, vagy ha lassú mechanikus merevlemezt használ. Amíg a másolás elkészül, a héjban látni fogja az „építési kontextus küldése a Docker démonnak” üzenetet.
A Docker önmagában próbálja minimalizálni a felesleges másolást. A BuildKit build backend – használt mivel Docker 18.09—Többlet-átviteli támogatás. Ez azt jelenti, hogy a Dockernek általában csak a legutóbbi építés óta hozzáadott vagy módosított fájlokat kell lemásolnia. Az első építéskor még mindig az egész tételt másolja.
Erőforrások kizárása az összeállítási kontextusból
A pazarló másolás végleges megoldása érdekében meg kell mondania a Dockernek, hogy mit hagyhat ki a build környezetből. Kezdjük azzal, hogy létrehozunk egy Dockerfile
:
FROM node:latest
WORKDIR /my-app
COPY package.json package.json
COPY package-lock.json package-lock.json
COPY src/ .
RUN npm install
Ez egyszerű Dockerfile
a Node.js-ben írt alkalmazás használhatja. A Node.js programok használják npm
mint csomagkezelőjük. A csomagokat a node_modules
mappába. Amikor futsz npm install
helyben, a fejlesztés során a csomagok letöltésre kerülnek a node_modules
mappát.
A Dockerfile
fut npm install
maga a függőségek megszerzésére. Ez biztosítja, hogy a kép teljesen önálló legyen. Nem kell másolni a helyi node_modules
mappát, mivel a Dockerfile
.
Ennek ellenére Docker továbbra is a node_modules
mappa az alapértelmezett build környezetben. Kizárásához hozzon létre a .dockerignore
fájlt a munkakönyvtárban. Ez a fájl hasonló szintaxissal rendelkezik, mint a .gitignore
.
node_modules/
A listában felsorolt útvonalak .dockerignore
kizárásra kerül az építési kontextusból. Ezt meg kell győződnie .dockerignore
folyamatosan frissül a projekt fájlrendszerének felépítésével. Jelentősen csökkentheti a Docker környezeti másolási idejét azáltal, hogy ellenőrzi, hogy csak a releváns útvonalak vannak-e (az Ön által ténylegesen használtak) Dockerfile
) jelen vannak az összeállítási kontextusban.
Példánk esetében a node_modules
mappa több ezer fájlt tartalmazhat, ha a projektünkben sok függőség van. Másolásuk a Docker démonba az építési környezet részeként néhány másodpercet vehet igénybe, és pazarló művelet lenne. A Dockerfile
teljesen figyelmen kívül hagyja őket, és saját függőségeit vonja maga után npm install
helyette.
Egyéb build-környezeti kérdések
Nem használ .dockerignore
más kérdéseket is bemutathat. Az ilyen vonallal rendelkező Docker-fájl különösen problematikus:
COPY . /my-app
Ez másolni fog minden a munkakönyvtárban. Ez jó ötletnek tűnhet, amíg rájössz, hogy a .git
az előzmények és a titkos fájlok is a tárolóba kerülnek.
A szűretlen összeállítási környezet másolása megakadályozza a Docker-réteg gyorsítótárának hatékony működését is. Mint valami a munkakönyvtárban valószínűleg megváltozik az építések között, a Dockernek futtatnia kellene a COPY
minden alkalommal. Ez új réteget hozna létre – és új rétegeket a későbbi utasításokhoz -, még akkor is, ha az Önt érdeklő eszközök nem változtak.
A Build kontextus tömörítése
Tömörítheti az összeállítási kontextust a továbbfejlesztés érdekében. Adja át a --compress
zászló docker build
gzip tömörítés alkalmazásához. A tömörítés a kontextus Docker démonra történő elküldése előtt történik.
docker build . -t my-image:latest --compress
Ez bizonyos esetekben javíthatja a teljesítményt. A tömörítés hozzáadja a saját általános költségeit – a rendszernek most tömörítenie kell a kontextust, és a fogadó Docker démonnak le kell tömörítenie. A tömörítés használata bizonyos esetekben valójában lassabb lehet, mint az eredeti fájlok másolása. Kísérletezzen az egyes képeivel, hogy felmérje, javulást tapasztal-e.
Következtetés
A Docker build környezet meghatározza azokat a fájlokat, amelyek másolhatók lesznek a fájlban Dockerfile
. Az összeállítás kontextusa átmásolásra kerül a Docker démonba, még az összeállítás megkezdése előtt.
A kontextusok létrehozása alapértelmezés szerint a könyvtár vagy a Git-adattár tartalmát tartalmazza docker build
. Az a létrehozásával kihagyhat elemeket az összeállítási környezetből .dockerignore
fájl. Ez növeli a hatékonyságot azáltal, hogy csökkenti a Docker démonhoz továbbított redundáns adatok mennyiségét.