Читать книгу Kubernetes - Kelsey Hightower - Страница 28
2.2.2Die Image-Größe optimieren
ОглавлениеEs gibt eine Reihe von Fallstricken, über die man stolpern kann, wenn man mit Container-Images experimentiert, und die zu viel zu großen Images führen. Denken Sie vor allem daran, dass Dateien, die in Folge-Layern aus dem System entfernt werden, im Image immer noch vorhanden sind – man kann nur nicht auf sie zugreifen. Schauen Sie sich diese Situation an:
.
└── Layer A: enthält eine große Datei namens 'BigFile'
└── Layer B: entfernt 'BigFile'
└── Layer C: baut auf B auf, fügt statisches Binary hinzu
Sie denken vielleicht, dass BigFile im Image nicht mehr vorhanden ist. Denn wenn Sie es laufen lassen, können Sie schließlich nicht mehr darauf zugreifen. Aber tatsächlich ist die Datei in Layer A immer noch vorhanden – wann immer Sie das Image pullen oder pushen, wird BigFile weiterhin durch das Netz geschoben, auch wenn Sie die Datei nicht mehr ansprechen können.
Ein weiterer Fallstrick betrifft das Cachen und Bauen von Images. Denken Sie daran, dass es sich bei jedem Layer um ein unabhängiges Delta zum vorhergehenden Layer handelt. Immer dann, wenn Sie einen Layer ändern, ändert sich auch jeder folgende Layer. Passen Sie den vorigen Layer an, müssen Sie Ihr eigenes Image neu bauen, neu pushen und neu pullen.
Um das besser zu verstehen, schauen Sie sich diese beiden Images an:
.
└── Layer A: enthält Basis-OS
└── Layer B: ergänzt Quellcode server.js
└── Layer C: installiert Paket 'node'
und
.
└── Layer A: enthält Basis-OS
└── Layer B: installiert Paket 'node'
└── Layer C: ergänzt Quellcode server.js
Es scheint so zu sein, dass sich beide Images gleich verhalten werden, und tatsächlich tun sie das zu Beginn auch. Aber überlegen Sie sich, was passiert, wenn sich server.js ändert. In dem einen Fall muss nur diese Änderung gepullt und gepusht werden, im anderen Fall müssen aber sowohl server.js als auch der Layer mit dem node-Paket gepullt und gepusht werden, weil Letzterer vom Layer mit server.js abhängt. Im Allgemeinen sollten Sie Ihre Layer so anordnen, dass die mit häufigeren Änderungen nach denen mit den weniger häufigen Änderungen kommen, um die Image-Größe beim Pullen und Pushen zu optimieren. Darum kopieren wir in Listing 2–4 die package*.json-Dateien und installieren die Abhängigkeiten, bevor wir den Rest der Programmdateien kopieren. Ein Entwickler wird die Programmdateien viel häufiger aktualisieren und anpassen, als das bei den Abhängigkeiten der Fall ist.