Table of Contents
Mitä ovat Multi-Stage Docker Rakentaa?
Monivaiheiset Docker rakentaa ovat ominaisuus otettu Docker 17.05, jonka avulla voit käyttää useita [ lausuntoja yhden Dockerfile. Jokainen [ opetus alkaa uuden vaiheen, joka voi olla oma peruskuva, riippuvuussuhteita, ja komentoja. Artefaktit voidaan valikoivasti kopioida yhdestä vaiheesta toiseen, kun taas lopullinen kuva vain säilyttää mitä on ehdottoman tarpeen käynnissä sovellus. Tämä lähestymistapa poistaa tarpeen manuaalisesti ketju Dockerfiles tai luottaa monimutkaisia rakentaa skriptejä, ja se vähentää kuvan kokoa sulkemalla pois kääntäjät, kehityskirjastot, ja välitiedostoja.
Perusidea on erottaa rakennusympäristö ajo-ympäristöstä. Tyypillisessä yhden vaiheen rakentamisessa kehittäjä asentaa kaikki rakennustyökalut (esim. kääntäjät, pakettipäälliköt, testikehykset) samaan kuvaan, jota käytetään tuotannossa. Tämä turpoaa kuvan ja lisää hyökkäyspintaa. Monivaiherakentaminen ratkaisee tämän käyttämällä paksua, ominaisuusrikasta kuvaa koostamiseen ja sitten vain tuloksena olevien esineiden kopioimiseen pieneksi juoksuaikakuvaksi, kuten tai .
Monivaiheisten rakennusten edut
Monivaiheisten rakennusten käyttöönoton edut ulottuvat yksinkertaisen koon vähentämisen lisäksi myös turvallisuuteen, ylläpidettävyyteen ja käyttöönottonopeuteen.
1. Pienennetty kuvakoko
Hylkäämällä building-time-riippuvuudet monivaiheinen rakentaa usein kutistaa kuvia 50%-90%. Esimerkiksi Node.js-sovellus rakennettu käyttämällä koko [ kuva (yli 300MB) voidaan ohentaa alle 20MB kopioimalla vain rakennettu [ kansio [] base. Tämä tallennus säästää suoraan kääntää nopeampaa vetoaikaa, vähemmän verkon kaistanleveys, ja alemmat rekisterin kustannukset.
2. Parannettu turvallisuus
Jokainen asennettu paketti tai työkalu säiliökuvassa on mahdollinen haavoittuvuus. Multi-stage rakentaa voit sulkea kääntäjät, vianetsintälaitteet ja kehityskirjastot pois lopullisen kuvan, merkittävästi vähentää hyökkäyspintaa. Voit jopa käyttää kuvia kuten [ tai [ varten ajovaiheessa, jotka sisältävät vain paljain minimi suorittaa sovelluksen binary.
3. Virtaviivaistettu rakenneprosessi
Kaikki rakennusvaiheet on määritelty yhdessä Dockerfile, jolloin prosessi on itsenäinen ja helppo versioida. CI/CD putkistot hyötyvät yhdestä sisääntulopiste: Dockerfile. Ei ole tarvetta ylläpitää erillisiä rakentaa skriptejä tai manuaalinen puhdistus vaiheet.
4. Uusiutuvuuden ja johdonmukaisuuden parantaminen
Koska koko rakennus on kaapattu yhteen Dockerfile, jokainen kehittäjä tai järjestelmä voi toistaa täsmälleen samat kerrokset. Käyttämällä tiettyjä versiota Tunnisteita peruskuvat lisää takaa johdonmukaisen rakentaa eri ympäristöissä.
Monivaiheisen Dockerfilen rakentaminen: askel askeleelta
Tämä läpikulku kattaa monivaiheisen monivaiheisen Dockerfile-tiedoston luomisen node.js- ja React-sovelluksia varten. Samat periaatteet koskevat kaikkia koottuja kieliä.
1. Suunnittele vaiheesi
Ennen koodin kirjoittamista kartoita tarvitsemasi vaiheet. Tyypillinen monivaiheinen rakenne on vähintään kaksivaiheinen:
- Rakentajavaihe[ ... .......................................................................................................................................................................................................................................
- Jälkeen vaiheessa[ . ... .....................................................................................................................................................................................................................................
Monimutkaisten hankkeiden voit lisätä välivaiheita testejä, staattinen analyysi, tai omaisuuden pakkaus.
2. Kirjoita Rakentajavaihe
Aloita peruskuvalla, joka sisältää tarvittavan työkaluketjun. Käytä nimellisiä vaiheita ja viittaa niihin myöhemmin.
FROM node:14-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build
Keskeiset seikat:
- Käytä deterministiseen ja nopeampaan huoltoon.
- Säilytä komentoja erillisinä kerroksina, kun mahdollista välimuistin käyttöön.
- Asenna vain tässä vaiheessa työkaluja (kuten tyyppiScript, webpack).
3. Lisää välitestivaihe (valinnainen)
Käytä koodin laatua ja lisää testivaihe. Tämä vaihe voi käyttää uudelleen rakentajakuvaa tai asentaa lisätyökaluja. Koska se ei ole viimeinen vaihe, testivirheitä ei näy lopullisessa kuvassa.
FROM builder AS test
RUN npm run test
Voit ajaa tämän vaiheen CI-putkessasi , jotta voit napata epäonnistumiset ajoissa rakentamatta koko lopullista kuvaa.
4. Määrittele Runtime Stage
React-sovelluksessa runtime-kuva voi olla Nginx-palvelin. Jos kyseessä on backend-aPI, se voi olla droless base-kuva tai minimaalinen Alpine, jossa on Node.js-ajoaika. Kopioi vain olennaiset esineet käyttäen .
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Jos tarvitset Node.js-ajoaikaa, vältä kopiointi rakennuttajalta; sen sijaan asenna tuotantoriippuvuus uudelleen ajoaikaan:
FROM node:14-alpine AS runtime
WORKDIR /app
COPY --from=builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]
5. Rakenna ja testaa kuva
Koosta lopullinen kuva vakiokomennolla:
docker build -t myapp:latest .
Tarkista koko ja vertaa sitä yhden vaiheen rakenteeseen. Aja säiliö ja vahvista sovellus vastaa oikein:
docker run -d -p 8080:80 myapp:latest
curl http://localhost:8080
Parhaat käytännöt monivaiheisiin rakenteisiin
- Käytä erityisiä peruskuvatunnisteita[] . Vältä yllätysten välttämiseksi. Mieluummin tai .
- ]Optimize quare caching .
- VahvirakennusKit[] ... mahdollistaa BuildKit :n avulla nopeampia rakennelmia, inline välimuistia ja parempaa rinnakkaisuutta.
- Luo useita loppuvaiheita eri ympäristöille[ . ... .................................................................................................................................................................................................................................
- Käytä kehitysrakennukseen[ ... .............................................................................................................................................................................................................................
- Pidä salaisuudet pois kuvista[ . Käytä Docker BuildKit.s .
Yleiset kuviot ja käyttötapaukset
Kootut kielet (Go, Rust, C++)
Staattisten binaarien osalta ajoaikavaihe voi käyttää (tyhjä peruskuva). Vain binääri- ja ehkä asetustiedosto on kopioitu. Esimerkki: Go:
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 go build -o myapp .
FROM scratch
COPY --from=builder /app/myapp /myapp
ENTRYPOINT ["/myapp"]
Python-sovellukset
Käytä rakennusvaihetta , jotta voit asentaa riippuvuuksia ja koota kaikki C-laajennukset, sitten kopioida vain asennetut paketit ajoaikaan:
FROM python:3.11-slim AS builder
WORKDIR /app
COPY requirements.txt .
RUN pip install --user -r requirements.txt
COPY . .
FROM python:3.11-slim
COPY --from=builder /root/.local /root/.local
COPY --from=builder /app /app
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
Prosentti API-palvelimella
Rakenna sekä etu- että takaosa yhdeksi Dockerfile. Käytä erillisiä rakennusvaiheita kullekin, sitten kopioi molemmat artefaktit yhdeksi runtime-kuvaksi:
FROM node:14-alpine AS frontend-builder
WORKDIR /app
COPY frontend/package*.json ./
RUN npm ci
COPY frontend/ .
RUN npm run build
FROM node:14-alpine AS api-builder
WORKDIR /app
COPY api/package*.json ./
RUN npm ci
COPY api/ .
RUN npm run build
FROM node:14-alpine
WORKDIR /app
COPY --from=frontend-builder /app/build ./public
COPY --from=api-builder /app/dist ./dist
RUN npm ci --only=production
EXPOSE 3000
CMD ["node", "dist/server.js"]
Monivaiheisten rakennelmien vianmääritys
- ]Layer välimuisti ei toimi[] . Varmista .
- ]Artefaktia ei löytynyt[ . Tarkista -lausunnon polut. Rakentajan vaiheen on tuotettava tulostus tietyssä paikassa. Käytä vianetsintään.
- Salainen vuoto[] . Älä koskaan kopioi kokonaisia kansioita, jotka saattavat sisältää tai [. Nimenomaan kopioida vain tarvittavat tiedostot.
- Suuret lopulliset kuvat monivaiheisesta[ .
Päätelmät
Monivaiheinen Docker rakentaa ovat kulmakivi modernin konttien. Ne mahdollistavat sinut siirtää laiha, turvallinen kuvia samalla pitää rakennusprosessi yksinkertainen ja dokumentoitu yhdessä Dockerfile. Erottamalla huolenaiheita rakentamisen ja ajoajan, voit merkittävästi pienentää kuvan kokoa, parantaa turvallisuutta, ja virtaviivaistaa CI/CD putkistot.Tässä esitetyt tekniikat koskevat lähes mihin pino. riippumatta siitä, olet rakentamassa Node.js, Go, Python, Java, tai Frontend sovelluksia. Aloita muuntamalla olemassa Dockerfiles multi-stage rakentaa, ja näet välittömästi parannuksia rakentamisen nopeutta, käyttöönotto tehokkuutta ja yleistä infrastruktuurikustannuksia.
Lisätietoja on saatavilla []virallisesta Docker multi-stage building-dokumentaatio[ ja Dockerfile-oppaasta . Reaalimaailman esimerkkejä on myös Docker Library-dokumentaatiossa[.