کاربرد استفاده از چند FROM در داکر چیست ؟
در طراحی تصویر داکر (Docker image)، مفهوم "FROM" به شما این امکان را میدهد که از تصویر دیگری به عنوان مبنایی برای تصویر جدید خود استفاده کنید. بر اساس مستندات داکر، "BASE IMAGE" به تصویری اشاره دارد که هیچ تصویر والد دیگری ندارد و شما میتوانید یک تصویر جدید را بر اساس آن بسازید.
هنگامی که شما دستور FROM neo4j/neo4j
را در Dockerfile استفاده می کنید، در واقع از تصویر Neo4j را به عنوان مبنای تصویر جدید خود استفاده کرده اید. به این ترتیب، اگر فرمانهای CMD
و ENTRYPOINT
را در تصویر جدید استفاده نکنید، با اجرای تصویر، پایگاه داده Neo4j به طور خودکار روی پورت ۷۴۷۴ در دسترس خواهد گرفت.
در صورتی که شما چندین دستور FROM را در یک Dockerfile استفاده کنید، باید بدانید که این به معنای استفاده از چندین تصویر است. هر دستور FROM جدید، تصویر قبلی را نادیده میگیرد و فقط تصویر نهایی (آخرین) به عنوان تصویر اصلی برای استفاده باقی میماند. در واقع، شما نمیتوانید سه تصویر مختلف را در یک تصویر ترکیب کنید. به جای آن، شما چهار تصویر خواهید داشت: سه تصویر مجزا برای هر FROM و یک تصویر جدید که بر اساس آخرین FROM ساخته شده است.
یک استراتژی رایج برای مدیریت نرمافزارهای موجود در داکر استفاده از "multi-stage builds" است. در این روش، میتوانید از چندین مرحله برای ساخت تصویر استفاده کنید، به طوری که در هر مرحله فقط فایلها و منابع مورد نیاز براساس تصویر مورد نظر استفاده می کنید. با استفاده از این روش، میتوانید تصاویر خاصی را برای هر یک از مراحل نرم افزار خود مانند تولید، تست یا استقرار ایجاد کنید. برای مثال، با استفاده از گزینه --target
در هنگام ساخت، میتوانید تنها تا مرحلهای خاص پیش بروید و تصاویری که نیاز ندارید را نادیده بگیرید. این به شما اجازه میدهد تا فرآیند ساخت را بهینهسازی کنید و تصاویر کوچکتری را ایجاد کنید.
برای نمونه استفاده از چندین FROM، داکرفایل زیر را مشاهده کنید، ابتدا بوسیله تصویر golang برنامه نوشته شده با go را بیلد می کنیم و سپس بوسیله تصویر alpine آن را برای استقرار آماده می کنیم.
FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/alexellis/href-counter/
RUN go get -d -v golang.org/x/net/html
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
FROM alpine:latest
RUN apk --no-cache add ca-certificates
WORKDIR /root/
COPY --from=builder /go/src/github.com/alexellis/href-counter/app .
CMD ["./app"]