Usar um estágio de build como base
Também é possível utilizar a imagem intermediária para outra imagem que, inclusive, pode ser uma imagem intermediária.
Dockerfile:
# IMAGEM INTERMEDIARIA 1
# imagem base nomeada como build
FROM golang:1.18.1 AS build
WORKDIR /build
COPY . .
# compilacao da aplicacao em binario
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# IMAGEM INTERMEDIARIA 2 A PARTIR DA IMAGEM INTERMEDIARIA 1
# imagem intermediaria package_build
# o binario da aplicacao compilada foi trazida para essa imagem
FROM build AS package_build
WORKDIR /pkg
# copia arquivo de imagem remota
COPY --from=marcelodpbarbieri/pacote-bin:latest /pkg/pacote.bin .
# IMAGEM FINAL
# imagem base nomeada como app
FROM alpine:3.20.2 AS app
WORKDIR /app
# copia do pacote.bin da imagem intermediaria (package_build)
COPY --from=package_build /pkg/pacote.bin .
# copia do binario da imagem intermediaria (build) para a imagem final
COPY --from=package_build /build/main .
CMD ["./main"]
Construção da imagem:
$ docker image build -t marcelodpbarbieri/app-multistage:multistage
-f Dockerfile . --no-cache
[+] Building 10.0s (18/18) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 875B 0.0s
=> [internal] load metadata for docker.io/marcelodpbarbieri/pacote-bin:lates 0.0s
=> [internal] load metadata for docker.io/library/golang:1.18.1 1.0s
=> [internal] load metadata for docker.io/library/alpine:3.20.2 1.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [build 1/4] FROM docker.io/library/golang:1.18.1@sha256:12d3995156cb0dcdb 0.0s
=> [app 1/4] FROM docker.io/library/alpine:3.20.2@sha256:0a4eaa0eecf5f8c050e 0.0s
=> [internal] load build context 0.0s
=> => transferring context: 84B 0.0s
=> CACHED FROM docker.io/marcelodpbarbieri/pacote-bin:latest 0.0s
=> CACHED [build 2/4] WORKDIR /build 0.0s
=> CACHED [app 2/4] WORKDIR /app 0.0s
=> [build 3/4] COPY . . 0.0s
=> [build 4/4] RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo - 8.5s
=> [package_build 1/2] WORKDIR /pkg 0.1s
=> [package_build 2/2] COPY --from=marcelodpbarbieri/pacote-bin:latest /pkg/ 0.1s
=> [app 3/4] COPY --from=package_build /pkg/pacote.bin . 0.1s
=> [app 4/4] COPY --from=package_build /build/main . 0.1s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:4bc91eb51672204636259acdc5f4ce71c1f38ab814878f840 0.0s
=> => naming to docker.io/marcelodpbarbieri/app-multistage:multistage 0.0s
$ docker container run -d -p 8080:8080 marcelodpbarbieri/app-multistage:multistage
55d824a2a0eb59c19460196f3543b6e7112f026cd1ea70a4205dbc21fb7aadcd
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
55d824a2a0eb marcelodpbarbieri/app-multistage:multistage "./main" 24 seconds ago Up 23 seconds 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp affectionate_sutherland
$ docker exec -it 55d824a2a0eb /bin/sh
/app # ls
main pacote.bin
$ docker image history marcelodpbarbieri/app-multistage:multistage
IMAGE CREATED CREATED BY SIZE COMMENT
4bc91eb51672 2 minutes ago CMD ["./main"] 0B buildkit.dockerfile.v0
<missing> 2 minutes ago COPY /build/main . # buildkit 6.24MB buildkit.dockerfile.v0
<missing> 2 minutes ago COPY /pkg/pacote.bin . # buildkit 9B buildkit.dockerfile.v0
<missing> 3 hours ago WORKDIR /app 0B buildkit.dockerfile.v0
<missing> 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
Last updated