Imagem externa no Multistage build
Além de copiar imagens que fazem parte das imagens intermediárias é possível copiar arquivos de outras imagens inclusive repositórios remotos.
Criação de uma imagem para armazenar o pacote binário:
$ pwd
/tmp/pacote
$ touch pacote.bin
$ vim pacote.bin
$ cat pacote.bin
Binário
$ touch Dockerfile
$ vim Dockerfile
$ cat Dockerfile
FROM alpine:3.20.2
WORKDIR /pkg
COPY . .
$ docker image build -t marcelodpbarbieri/pacote-bin -f Dockerfile .
[+] Building 3.5s (9/9) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 78B 0.0s
=> [internal] load metadata for docker.io/library/alpine:3.20.2 2.7s
=> [auth] library/alpine:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [1/3] FROM docker.io/library/alpine:3.20.2@sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fb 0.5s
=> => resolve docker.io/library/alpine:3.20.2@sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fb 0.0s
=> => sha256:c6a83fedfae6ed8a4f5f7cbb6a7b6f1c1ec3d86fea8cb9e5ba2e5e6673fde9f6 3.62MB / 3.62MB 0.4s
=> => sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3910ef9ab5fbe9f5 1.85kB / 1.85kB 0.0s
=> => sha256:eddacbc7e24bf8799a4ed3cdcfa50d4b88a323695ad80f317b6629883b2c2a78 528B / 528B 0.0s
=> => sha256:324bc02ae1231fd9255658c128086395d3fa0aedd5a41ab6b034fd649d1a9260 1.47kB / 1.47kB 0.0s
=> => extracting sha256:c6a83fedfae6ed8a4f5f7cbb6a7b6f1c1ec3d86fea8cb9e5ba2e5e6673fde9f6 0.1s
=> [internal] load build context 0.0s
=> => transferring context: 126B 0.0s
=> [2/3] WORKDIR /pkg 0.0s
=> [3/3] COPY . . 0.0s
=> exporting to image 0.1s
=> => exporting layers 0.0s
=> => writing image sha256:04018fdd126926818c26277636375115b46c41bccb00668af58a0fcf4b8654b8 0.0s
=> => naming to docker.io/marcelodpbarbieri/pacote-bin 0.0s
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
marcelodpbarbieri/pacote-bin latest 04018fdd1269 24 seconds ago 7.8MB
$ docker image push marcelodpbarbieri/pacote-bin
Using default tag: latest
The push refers to repository [docker.io/marcelodpbarbieri/pacote-bin]
dbbf66204e71: Pushed
289d56dfbc63: Pushed
78561cef0761: Mounted from marcelodpbarbieri/conversao-temperatura
latest: digest: sha256:d8eda8c30cd5bfaa0dcce6b903496c1415c849a9c351f6016ef845591ca44651 size: 940
$ docker container run -it marcelodpbarbieri/pacote-bin /bin/sh
/pkg # ls
Dockerfile pacote.bin
Construção da imagem final com referência ao pacote.bin da imagem remota.
Dockerfile:
# IMAGEM INTERMEDIARIA
# imagem base nomeada como build
FROM golang:1.18.1 AS build
WORKDIR /build
COPY . .
# compilacao da aplicacao
RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
# IMAGEM FINAL
# imagem base nomeada como app
FROM alpine:3.20.2 AS app
WORKDIR /app
# copia arquivo de imagem remota
COPY --from=marcelodpbarbieri/pacote-bin:latest /pkg/pacote.bin .
# copia do binario da imagem intermediaria (build) para a imagem final
COPY --from=build /build/main .
CMD ["./main"]
Destaque para:
# copia arquivo de imagem remota
COPY --from=marcelodpbarbieri/pacote-bin:latest /pkg/pacote.bin .
Construção da imagem final:
$ pwd
/tmp/go
$ docker image build -t marcelodpbarbieri/app-multistage:multistage -f Dockerfile .
[+] Building 37.5s (18/18) FINISHED docker:default
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 545B 0.0s
=> [internal] load metadata for docker.io/marcelodpbarbieri/pacote-bin:latest 0.0s
=> [internal] load metadata for docker.io/library/golang:1.18.1 2.8s
=> [internal] load metadata for docker.io/library/alpine:3.20.2 1.4s
=> [auth] library/alpine:pull token for registry-1.docker.io 0.0s
=> [auth] library/golang:pull token for registry-1.docker.io 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [build 1/4] FROM docker.io/library/golang:1.18.1@sha256:12d3995156cb0dcdbb9d3edb5827e4e8e1bf5bf92436bfd12d696 24.8s
=> => resolve docker.io/library/golang:1.18.1@sha256:12d3995156cb0dcdbb9d3edb5827e4e8e1bf5bf92436bfd12d696ec99700 0.0s
=> => sha256:5b75b529da0f2196ee8561a90e5b99aceee56e125c6ef09a3da4e32cf3cc6c20 1.80kB / 1.80kB 0.0s
=> => sha256:65375c930b214d93a4c09a1db748e6979ef53ad585ec864dbe837108d48d8d14 7.05kB / 7.05kB 0.0s
=> => sha256:c357e2c68cb3bf1e98dcb3eb6ceb16837253db71535921d6993c594588bffe04 10.87MB / 10.87MB 2.0s
=> => sha256:12d3995156cb0dcdbb9d3edb5827e4e8e1bf5bf92436bfd12d696ec997001a9a 2.35kB / 2.35kB 0.0s
=> => sha256:967757d5652770cfa81b6cc7577d65e06d336173da116d1fb5b2d349d5d44127 5.16MB / 5.16MB 1.0s
=> => sha256:6aefca2dc61dcbcd268b8a9861e552f9cdb69e57242faec64ac120d2355a9c1a 54.94MB / 54.94MB 2.5s
=> => sha256:c766e27afb21eddf9ab3e4349700ebe697c32a4c6ada6af4f08282277a291a28 54.58MB / 54.58MB 4.1s
=> => sha256:d6a8ea6bd5f867dbdf5bad1c42bc569afacf062a0241c1a8b45718fc8ae26fba 85.84MB / 85.84MB 7.8s
=> => extracting sha256:6aefca2dc61dcbcd268b8a9861e552f9cdb69e57242faec64ac120d2355a9c1a 5.2s
=> => sha256:13a9b904f7423b8b1f02a99df065ceb2de067207d626915b84776bb0c918ed0f 141.70MB / 141.70MB 9.8s
=> => sha256:3447e3508f49d81eb14b0cf466950f15126161f20f2d70b8d429017d2b08a74f 156B / 156B 4.5s
=> => extracting sha256:967757d5652770cfa81b6cc7577d65e06d336173da116d1fb5b2d349d5d44127 0.7s
=> => extracting sha256:c357e2c68cb3bf1e98dcb3eb6ceb16837253db71535921d6993c594588bffe04 0.5s
=> => extracting sha256:c766e27afb21eddf9ab3e4349700ebe697c32a4c6ada6af4f08282277a291a28 3.6s
=> => extracting sha256:d6a8ea6bd5f867dbdf5bad1c42bc569afacf062a0241c1a8b45718fc8ae26fba 3.2s
=> => extracting sha256:13a9b904f7423b8b1f02a99df065ceb2de067207d626915b84776bb0c918ed0f 8.0s
=> => extracting sha256:3447e3508f49d81eb14b0cf466950f15126161f20f2d70b8d429017d2b08a74f 0.0s
=> [internal] load build context 0.1s
=> => transferring context: 928B 0.0s
=> FROM docker.io/marcelodpbarbieri/pacote-bin:latest 0.1s
=> CACHED [app 1/4] FROM docker.io/library/alpine:3.20.2@sha256:0a4eaa0eecf5f8c050e5bba433f58c052be7587ee8af3e8b3 0.0s
=> [app 2/4] WORKDIR /app 0.1s
=> [app 3/4] COPY --from=marcelodpbarbieri/pacote-bin:latest /pkg/pacote.bin . 0.1s
=> [build 2/4] WORKDIR /build 0.7s
=> [build 3/4] COPY . . 0.1s
=> [build 4/4] RUN CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main . 8.8s
=> [app 4/4] COPY --from=build /build/main . 0.1s
=> exporting to image 0.1s
=> => exporting layers 0.1s
=> => writing image sha256:8b69e2fd86c7a5513045571b1ceead461c3ddca8c7f003a5af286e175547f429 0.0s
=> => naming to docker.io/marcelodpbarbieri/app-multistage:multistage 0.0s
Destaque para:
=> [app 3/4] COPY --from=marcelodpbarbieri/pacote-bin:latest /pkg/pacote.bin .
Teste da aplicação:
$ docker container run -d -p 8080:8080 marcelodpbarbieri/app-multistage:multistage
22faa5f4dd259e87e1ecc13b2de6dc0cb3e868858fc0554cdedfd5e7ec8f05b6
Acessar o container:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
22faa5f4dd25 marcelodpbarbieri/app-multistage:multistage "./main" About a minute ago Up About a minute 0.0.0.0:8080->8080/tcp, :::8080->8080/tcp awesome_poincare
$ docker exec -it 22faa5f4dd25 /bin/bash
OCI runtime exec failed: exec failed: unable to start container process: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown
$ docker exec -it 22faa5f4dd25 /bin/sh
/app # ls
main pacote.bin
Last updated