Implementaties stroomlijnen met multi-stage container builds
Systemen worden snel erg groot wanneer ze volledig worden geleverd. Dit omvat de build-omgeving en vaak ook de testomgeving. Zelfs als het uitpakken van de te leveren bestanden geen probleem is, is het tijdrovend.
Containers bieden de mogelijkheid om dit geautomatiseerd te doen.
Hierbij kun je meerdere containers in één bestand definiëren. Een website die in JavaScript is geschreven en met Node.js wordt gebouwd, is een goed voorbeeld.
Voorbeeld:
- Node.js: ~ 400 – 600 MB
- Webserver nginx: ~ 20 MB
- Website: ~ 2 MB
Het hele systeem als container resulteert in een totaal van meer dan 600 MB, terwijl er eigenlijk alleen 22 MB (webserver + website) nodig zijn. Bovendien vormt dit een beveiligingsrisico omdat onnodige software aanwezig is die niet nodig is voor productie. De oplossing hiervoor is een multi-stage build.
Bij een multi-stage build worden verschillende containers in één bestand gedefinieerd en worden alleen de benodigde gegevens van de ene container naar de andere overgedragen.
Voorbeeld van een multi-stage Dockerfile
We blijven bij het Node.js-voorbeeld. De eerste container bevat Node.js als buildsysteem; daarin wordt de website gemaakt. De tweede container bevat de webserver, die na de build de benodigde data uit de eerste container kopieert.
## Basis-systeem – Stage 1 ## Gebruik community Node.js container FROM node:8.11.3 as buildsystem ## Voeg broncode toe vanuit ons Git-project COPY ./source /root/frontend ## Build frontend met Node.js WORKDIR /root/frontend/ RUN npm install \ && npm run build ##################################################################### ##################################################################### ## Basis-systeem – Stage 2 ## Gebruik community nginx container FROM nginx:alpine ## Kopieer build-artefacten van stage 1 RUN mkdir -p /var/www/html/<MyApp> COPY --from=buildsystem /root/frontend/dist/ /var/www/html/<MyApp>/ ## Voeg standaardconfiguratie toe voor nginx ADD default.conf /etc/nginx/conf.d/ ## Publiceer poort EXPOSE 80 ## Start nginx CMD ["nginx", "-g", "daemon off;"]
Het resultaat is een kleine container die alleen de absolute noodzakelijke onderdelen bevat. We gebruiken een zeer kleine Linux-distributie voor nginx, namelijk Alpine.
Een ander voordeel is dat je twee kant-en-klare community-containers kunt gebruiken, zodat je geen werk hebt met het aanmaken en onderhouden ervan. Voor systeemupdates worden de community-containers gewoon regelmatig vervangen. Het hele proces laat zich prima automatiseren in een pipeline met GitLab (of andere tools).
Industriële technologie
- Bouw je eerste IoT-project met Raspberry Pi, DHT11 en ThingSpeak
- Vermenigvuldigen en delen met wetenschappelijke notatie beheersen
- Industry 4.0 Inzichten: Q&A met Verena Majuntke van Bosch.IO over IoT, Automatisering en de Toekomstfabriek
- Microsoft Onthult Recordbrekend 17-Miljard-Parameter Taalmodel
- AI-gedreven roadmaps: Een strategische gids voor supply chain bedrijven
- Slim inkoop: AI samensmelten met menselijk inzicht
- Efficiënte ARM-containerbuilds op x86-systemen
- Implementaties stroomlijnen met multi-stage container builds
- Node-RED in Docker beheersen: Expert-tips & best practices
- Efficiënte Containerkranen: Precisie Laden &lossen voor Havens en Rangeryards
- Vertrouwen Opbouwen Met Zakelijke Leiders: De Juiste Cloud-services Kiezen