Les constructions en plusieurs étapes dans Docker sont une fonctionnalité qui vous permet d'utiliser plusieurs FROM
dans votre dockerfile. Chacun FROM
déclaration peut démarrer une nouvelle étape du processus de construction, et vous pouvez copier des artefacts d'une étape à une autre. Cette méthode est particulièrement utile pour créer des images Docker plus petites et plus sécurisées en séparant l'environnement de construction de l'environnement d'exécution.
Voici comment vous pouvez utiliser des versions multiples pour y parvenir:
Définissez l'étape de construction : commencez par définir une étape de construction où vous compilez votre application ou préparez vos artefacts. Par exemple, vous pouvez utiliser une image golang
pour compiler une application Go.
<code class="Dockerfile">FROM golang:1.16 as builder WORKDIR /app COPY . . RUN go build -o myapp</code>
Définissez l'étape de l'exécution : Après l'étape de construction, définissez une étape d'exécution avec une image de base minimale. Copiez uniquement les artefacts nécessaires de la scène de construction dans cette étape d'exécution.
<code class="Dockerfile">FROM alpine:3.14 COPY --from=builder /app/myapp /myapp CMD ["/myapp"]</code>
En utilisant des versions en plusieurs étapes, vous vous retrouvez avec une image finale qui ne contient que ce qui est nécessaire pour exécuter votre application, ce qui est nettement plus petit et a moins de vulnérabilités potentielles par rapport à l'image utilisée pour la construction.
L'organisation du code efficacement dans une version Docker en plusieurs étapes peut améliorer considérablement l'efficacité et la clarté de votre dockerfile. Voici quelques meilleures pratiques:
Préoccupations distinctes : utilisez différentes étapes à différentes fins (par exemple, construire, tester et déploier). Cette séparation des préoccupations rend votre docker plus facile à comprendre et à entretenir.
<code class="Dockerfile"># Build stage FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build # Test stage FROM node:14 as tester WORKDIR /app COPY --from=builder /app . RUN npm run test # Runtime stage FROM node:14-alpine WORKDIR /app COPY --from=builder /app/build /app/build CMD ["node", "app/build/index.js"]</code>
Minimisez le nombre de couches : combinez les commandes d'exécution dans la mesure du possible pour réduire le nombre de couches dans votre image. Cette pratique accélère non seulement le processus de construction, mais rend également l'image résultante plus petite.
<code class="Dockerfile">RUN apt-get update && \ apt-get install -y some-package && \ rm -rf /var/lib/apt/lists/*</code>
.dockerignore
: créez un fichier .dockerignore
pour exclure les fichiers inutiles d'être copiés dans le contexte de build docker. Cela accélère le processus de construction et réduit la taille de l'image.package.json
, exécuter npm install
, puis copier le reste de l'application.L'optimisation de la mise en cache dans les constructions Docker en plusieurs étapes peut réduire considérablement les temps de construction. Voici plusieurs stratégies pour y parvenir:
Ordre des opérations : Placez fréquemment les commandes changeant vers la fin de votre dockerfile. Docker mettra en cache les couches depuis le début du Dockerfile, accélérant les versions ultérieures.
<code class="Dockerfile">FROM node:14 as builder WORKDIR /app COPY package*.json ./ RUN npm install COPY . . RUN npm run build</code>
Dans cet exemple, npm install
est moins susceptible de changer que le code d'application, il est donc placé avant la COPY . .
commande.
Levier BuildKit : Docker BuildKit offre des mécanismes de mise en cache de construction améliorés. Activez BuildKit en définissant la variable d'environnement DOCKER_BUILDKIT=1
et utilisez la nouvelle commande RUN --mount
pour monter les répertoires de cache.
<code class="Dockerfile"># syntax=docker/dockerfile:experimental FROM golang:1.16 as builder RUN --mount=type=cache,target=/root/.cache/go-build \ go build -o myapp</code>
.dockerignore
pour exclure les fichiers inutiles du contexte de build. Un contexte plus petit signifie moins de données à transférer et une construction plus rapide.Les buts Docker en plusieurs étapes offrent plusieurs avantages de sécurité par rapport aux versions à un étage:
En tirant parti des builds en plusieurs étapes, vous pouvez améliorer considérablement la posture de sécurité de vos images Docker tout en optimisant leur taille et leurs performances.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!