Ինչպե՞ս եք օգտագործում բազմաշերտ (multistage) կառուցվածքը Docker պատկերների օպտիմալացման համար։
sobes.tech AI
Պատասխան AI-ից
Շատ շերտային հավաքումը թույլ է տալիս օգտագործել մի քանի փուլ (layers) Dockerfile-ում, որտեղ յուրաքանչյուր փուլ իր առաքելությունն է կատարում: Մի փուլից (օրինակ՝ կոմպիլյացված արհեստը) արդյունքը փոխանցվում է հաջորդ փուլին, բայց նախորդ փուլերի միջանկյալ շերտերը չեն ներառվում վերջնական պատկերի մեջ:
Օրինակ՝ Go հավելվածի հավաքման համար:
# Հավաքման փուլ
FROM golang:1.20-alpine AS builder
WORKDIR /app
COPY . .
RUN go build -o /app/myapp
# Վերջնական փուլ
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp /app/
CMD ["/app/myapp"]
Առավելություններ՝
- Պատկերի չափի նվազեցում: Վերջնական պատկերի մեջ միայն հավաքված հավելվածն ու անհրաժեշտ կախվածությունները են, ոչ թե հավաքման գործիքները, աղբյուրային կոդը կամ միջանկյալ ֆայլերը:
- Պատասխանատվության բաժանում: Կոմպիլյացիա/տեղադրման տրամաբանությունը բաժանվում է տեղադրման տրամաբանությունից:
- Անվտանգության բարձրացում: Անհրաժեշտ գործիքների և գրադարանների բացառմամբ նվազում է հարձակման մակերեսը:
- Հետագա հավաքումների արագացում: Շերտերի կեշավորումը կարող է արագացնել կրկնվող հավաքումները:
Օրինակ՝ տրամադրված Dockerfile-ում, առաջին շերտը builder օգտագործվում է Go հավելվածի հավաքման համար: Երկրորդ շերտը, որը սկսվում է FROM alpine:latest, պատճենում է միայն առաջին շերտից հավաքված հավելվածը (COPY --from=builder /app/myapp /app/) մաքուր բազային պատկերի մեջ: Վերջնական պատկերը պարունակում է միայն գործարկվող ֆայլը և հիմնական օպերացիոն համակարգը, առանց Go կոմպիլյատորի և աղբյուրային կոդի:
Այս կերպ զգալիորեն նվազում է պատկերի չափը՝ համեմատած ավանդական մոտեցման, երբ հավաքումը և գործարկումը տեղի են ունենում մեկ կոնտեյներով։