Docker Multi-stage Builds: Understanding Multiple FROM Directives and Their Applications

Nov 23, 2025 · Programming · 9 views · 7.8

Keywords: Docker multi-stage builds | FROM directives | base images

Abstract: This article provides an in-depth exploration of the technical principles and application scenarios of multiple FROM directives in Docker. Through analysis of core multi-stage build concepts, it explains how to copy files between different build stages and optimize the build process using the --target option. The article includes complete code examples demonstrating how to build Docker images containing both Neo4j database and Node.js, while discussing best practices in microservices architecture.

Fundamentals of Docker Multi-stage Builds

In the Docker ecosystem, multi-stage builds represent a significant functional innovation that allows developers to define multiple build stages within a single Dockerfile. Each stage begins with a FROM instruction and can be based on different base images, with only the content from the final stage retained in the output image. This mechanism is particularly suitable for scenarios requiring complex build processes but aiming to generate lean runtime images.

Core Syntax of Multi-stage Builds

The basic syntax of multi-stage builds involves using the FROM instruction multiple times within a Dockerfile. Each FROM instruction can optionally use the AS keyword to name the build stage, enabling subsequent COPY --from instructions to copy files from specified stages. The image defined by the last FROM instruction serves as the base for the final output image.

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"]

The Nature of Base Images

Base images are a fundamental concept in Docker, containing the file system required for application execution, exposed port configurations, ENTRYPOINT, and CMD instructions. When specifying a base image using the FROM instruction in a Dockerfile, the new image inherits all characteristics of the base image. For instance, using FROM neo4j/neo4j means the new image is built upon the Neo4j image, and as long as CMD and ENTRYPOINT are not overwritten, the Neo4j database will automatically start and be available on port 7474 when the container runs.

Advanced Applications of the --target Option

The --target option in the Docker build command provides finer control over multi-stage builds. By specifying target build stages, developers can selectively build specific parts of the Dockerfile, which is valuable in complex projects.

docker build --target tester -t myapp-test .

This mechanism supports various application scenarios: building images containing only project dependencies for caching optimization; separating build and runtime environments to enhance security; and creating customized images for different environments (development, testing, production).

Complete Multi-stage Build Example

The following example demonstrates a multi-stage Dockerfile containing build, test, and deployment stages:

# Builder stage
FROM golang:1.7.3 as builder
WORKDIR /go/src/github.com/example/project/
COPY app.go .
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .

# Tester stage
FROM builder as tester
COPY . .
RUN go test ./...

# Deployer stage
FROM alpine:latest as deployer
COPY --from=builder /go/src/github.com/example/project/app /app
CMD ["/app"]

Build Cache Optimization Strategies

Cache management is particularly important in multi-stage builds. The --no-cache-filter option allows developers to force rebuilding of specific stages without affecting caches of other stages. For example, to ensure the test stage is always rebuilt:

docker build --no-cache-filter test --target test --tag your-image-name:version .

Best Practices in Microservices Architecture

While multi-stage builds offer the possibility of combining multiple applications within a single image, microservices architecture is often more appropriate in production environments. Running multiple dedicated containers that communicate over networks provides better maintainability, scalability, and fault isolation. Tools like Docker Compose can simplify the management and deployment of multi-container applications.

Analysis of Practical Application Scenarios

Considering scenarios requiring both Neo4j database and Node.js application execution, multi-stage builds can be implemented as follows: use one stage specifically for Neo4j configuration and initialization, another stage for Node.js application building, and a final stage combining necessary components to generate the deployment image. This approach ensures functional completeness while controlling image size and security.

Copyright Notice: All rights in this article are reserved by the operators of DevGex. Reasonable sharing and citation are welcome; any reproduction, excerpting, or re-publication without prior permission is prohibited.