Criar uma nova imagem a partir de múltiplas imagens de origem
Nesta etapa, aprenderemos como criar uma nova imagem Docker combinando o conteúdo de múltiplas imagens de origem. Este é um cenário comum quando você precisa construir uma imagem que inclui componentes de diferentes imagens base ou imagens pré-construídas.
Primeiro, vamos baixar (pull) as imagens de origem necessárias. Usaremos as imagens ubuntu e alpine como exemplos.
docker pull ubuntu:latest
docker pull alpine:latest
Você deve ver uma saída indicando que as imagens estão sendo baixadas.
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
Agora, criaremos uma nova imagem usando um Dockerfile. Um Dockerfile é um documento de texto que contém todos os comandos que um usuário pode chamar na linha de comando para montar uma imagem. Crie um novo arquivo chamado Dockerfile no seu diretório ~/project.
nano ~/project/Dockerfile
Adicione o seguinte conteúdo ao Dockerfile:
FROM ubuntu:latest AS base
FROM alpine:latest AS alpine_base
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
COPY --from=base /etc/os-release /app/ubuntu-release
WORKDIR /app
CMD ["ls", "-l"]
Vamos detalhar este Dockerfile:
FROM ubuntu:latest AS base: Esta linha define a imagem base para o primeiro estágio da nossa construção como ubuntu:latest e nomeia este estágio como base.
FROM alpine:latest AS alpine_base: Esta linha inicia um novo estágio de construção usando alpine:latest como imagem base e nomeia este estágio como alpine_base. Esta é uma construção de múltiplos estágios (multi-stage build), permitindo que copiemos arquivos entre os estágios.
COPY --from=alpine_base /etc/alpine-release /app/alpine-release: Este comando copia o arquivo /etc/alpine-release do estágio alpine_base para o diretório /app/alpine-release no estágio atual.
COPY --from=base /etc/os-release /app/ubuntu-release: Este comando copia o arquivo /etc/os-release do estágio base para o diretório /app/ubuntu-release no estágio atual.
WORKDIR /app: Isso define o diretório de trabalho para as instruções subsequentes como /app.
CMD ["ls", "-l"]: Isso especifica o comando padrão a ser executado quando um container é iniciado a partir desta imagem. Ele listará o conteúdo do diretório /app.
Salve o Dockerfile pressionando Ctrl + X, depois Y e Enter.
Agora, construa a imagem usando o comando docker build. O . no final do comando especifica o contexto de construção (build context), que é o diretório atual (~/project).
docker build -t my-multi-stage-image:latest ~/project
Você deve ver uma saída indicando o processo de construção, incluindo os diferentes estágios sendo executados.
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
Após a conclusão da construção, você pode verificar se a imagem foi criada listando suas imagens locais.
docker images my-multi-stage-image
Você deve ver sua imagem recém-criada na lista.
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
Finalmente, vamos executar um container a partir desta imagem para ver os arquivos copiados.
docker run --rm my-multi-stage-image:latest
A flag --rm remove automaticamente o container quando ele sai. A saída deve mostrar os arquivos copiados das imagens ubuntu e alpine.
total 8
-rw-r--r-- 1 root root 25 Aug 24 10:00 alpine-release
-rw-r--r-- 1 root root 281 Aug 24 10:00 ubuntu-release
Isso confirma que criamos com sucesso uma imagem combinando o conteúdo de múltiplas imagens de origem usando uma construção de múltiplos estágios.