Crear una nueva imagen a partir de múltiples imágenes fuente
En este paso, aprenderemos cómo crear una nueva imagen de Docker combinando contenido de múltiples imágenes fuente. Este es un escenario común cuando necesitas construir una imagen que incluya componentes de diferentes imágenes base o imágenes preconstruidas.
Primero, descargaremos las imágenes fuente necesarias. Usaremos las imágenes ubuntu
y alpine
como ejemplos.
docker pull ubuntu:latest
docker pull alpine:latest
Deberías ver una salida que indica que las imágenes están siendo descargadas.
latest: Pulling from library/ubuntu
...
Status: Downloaded newer image for ubuntu:latest
latest: Pulling from library/alpine
...
Status: Downloaded newer image for alpine:latest
Ahora, crearemos una nueva imagen usando un Dockerfile
. Un Dockerfile
es un documento de texto que contiene todos los comandos que un usuario podría ejecutar en la línea de comandos para ensamblar una imagen. Crea un nuevo archivo llamado Dockerfile
en tu directorio ~/project
.
nano ~/project/Dockerfile
Añade el siguiente contenido al 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"]
Analicemos este Dockerfile
:
FROM ubuntu:latest AS base
: Esta línea establece la imagen base para la primera etapa de nuestra construcción como ubuntu:latest
y nombra esta etapa base
.
FROM alpine:latest AS alpine_base
: Esta línea inicia una nueva etapa de construcción usando alpine:latest
como imagen base y nombra esta etapa alpine_base
. Esta es una construcción multi-etapa, permitiéndonos copiar archivos entre etapas.
COPY --from=alpine_base /etc/alpine-release /app/alpine-release
: Este comando copia el archivo /etc/alpine-release
de la etapa alpine_base
al directorio /app/alpine-release
en la etapa actual.
COPY --from=base /etc/os-release /app/ubuntu-release
: Este comando copia el archivo /etc/os-release
de la etapa base
al directorio /app/ubuntu-release
en la etapa actual.
WORKDIR /app
: Establece el directorio de trabajo para las instrucciones posteriores como /app
.
CMD ["ls", "-l"]
: Especifica el comando predeterminado que se ejecutará cuando se inicie un contenedor desde esta imagen. Listará los contenidos del directorio /app
.
Guarda el Dockerfile
presionando Ctrl + X
, luego Y
, y Enter
.
Ahora, construye la imagen usando el comando docker build
. El .
al final del comando especifica el contexto de construcción, que es el directorio actual (~/project
).
docker build -t my-multi-stage-image:latest ~/project
Deberías ver una salida que indica el proceso de construcción, incluyendo las diferentes etapas que se están ejecutando.
[+] Building
...
Successfully built <image_id>
Successfully tagged my-multi-stage-image:latest
Una vez completada la construcción, puedes verificar que la imagen fue creada listando tus imágenes locales.
docker images my-multi-stage-image
Deberías ver tu nueva imagen en la lista.
REPOSITORY TAG IMAGE ID CREATED SIZE
my-multi-stage-image latest <image_id> About a minute ago ...MB
Finalmente, ejecutemos un contenedor desde esta imagen para ver los archivos copiados.
docker run --rm my-multi-stage-image:latest
La bandera --rm
elimina automáticamente el contenedor cuando termina. La salida debería mostrar los archivos copiados de las imágenes ubuntu
y 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
Esto confirma que hemos creado exitosamente una imagen combinando contenido de múltiples imágenes fuente usando una construcción multi-etapa.