Sobes.tech
Middle

Ինչպե՞ս եք օգտագործում բազմաշերտ (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 կոմպիլյատորի և աղբյուրային կոդի:

Այս կերպ զգալիորեն նվազում է պատկերի չափը՝ համեմատած ավանդական մոտեցման, երբ հավաքումը և գործարկումը տեղի են ունենում մեկ կոնտեյներով։