¿Cómo combinar múltiples imágenes base usando un solo Dockerfile?

Si está trabajando en un gran proyecto de microservicios con Docker Containers, el ciclo de desarrollo consta de varias fases. Ahora, mantener diferentes dockerfiles para diferentes fases del desarrollo consume muchos recursos y genera redundancia, ya que varios componentes del proyecto pueden contener archivos comunes. Realmente se vuelve innecesario usar dockerfiles separados para la fase de compilación, la fase de desarrollo, la fase de lanzamiento y la fase de prueba. 

En versiones posteriores de Docker, proporciona el uso de archivos docker de varias etapas . Con los dockerfiles de varias etapas , puede usar varias imágenes base, así como capas de imágenes intermedias anteriores, para crear una nueva capa de imágenes. Básicamente, le permite crear una jerarquía completa de instrucciones de Docker que podrían usarse para crear diferentes conjuntos de imágenes con diferentes funcionalidades pero todo en un solo archivo docker . El uso de dos comandos, FROM y AS , en particular, le permite crear un dockerfile de varias etapas . Le permite crear varias capas de imágenes sobre las capas anteriores y el comando AS proporciona un nombre virtual a la capa de imagen intermedia. El último DESDEEl comando en el dockerfile crea la imagen final real.

En este artículo, veremos un ejemplo de un dockerfile de varias etapas y cómo puede usarlo en sus proyectos de Docker.

1. Creación de un dockerfile de varias etapas

Para empezar, consideremos el archivo docker a continuación.

#Create the base OS image
FROM python:3 AS base

#Update the OS ubuntu image
RUN apt-get -y update

#Install packages
RUN apt-get -y install firefox \
&& apt-get -y install vim

#Create another image layer on top of base to install requirements
FROM base AS requirements

#Install the requirements
RUN pip3 install -r requirements.txt

#Create an intermediate image layer for testing purpose
FROM requirements as test

#Create the build context
COPY /usr/src/my-app /desktop/my-app

#Test the final app
CMD ["python3", "index.py"]

Repasemos el dockerfile anterior paso a paso.

  1. Primero, extrajimos las imágenes base de python 3 directamente del registro de Docker. También establece que el sistema operativo de la imagen base sea Ubuntu de forma predeterminada. Hemos utilizado un nombre virtual llamado «base» para esta capa de imagen.
  2. Luego, ejecutamos una actualización apt en el sistema operativo Ubuntu.
  3. Después de eso, instalamos algunos paquetes básicos como el navegador Firefox y el editor de texto vim.
  4. Usando la imagen base, creamos otra capa de imagen encima llamada «requisitos» que instala las dependencias desde un archivo separado llamado «requisitos.txt».
  5. Usando esta imagen como imagen base, hemos creado otra capa de imagen intermedia llamada «prueba» que crea el contexto de compilación y copia los archivos y directorios, y finalmente ejecuta la aplicación python para la prueba.

2. Crear el archivo de requisitos

En la ficha de requisitos mencionamos las dependencias que queremos instalar.

flask
pandas
numpy

3. Crear el archivo index.py

El archivo principal que queremos ejecutar y que hemos especificado en los argumentos CMD de dockerfile es el archivo index.py . En el archivo index.py , simplemente incluimos una declaración de impresión con fines de demostración.

print("geeksforgeeks")

4. Construyendo la imagen de Docker

Para construir la imagen de Docker, usamos el comando Build de Docker.

sudo docker build -t sample-image .
Building the Image

Construyendo la Imagen

5. Ejecutando el Contenedor Docker

Una vez que hayamos creado correctamente la imagen de Docker, podemos ejecutar el contenedor con el comando de ejecución de Docker.

sudo docker run -it sample-image
Running the Container

Ejecutar el contenedor

Podemos ver claramente cómo la combinación de los comandos FROM y AS puede ayudarnos a crear una jerarquía única para todos nuestros proyectos o componentes de proyectos. Básicamente, nos permite realizar la herencia de los componentes de la imagen, incluidas las herencias jerárquicas o múltiples en función de cómo combine esos comandos.

Esto demuestra ser muy útil porque le permite realizar todas las tareas utilizando un solo dockerfile , lo que facilita la gestión de versiones, brinda una mejor visión general de todo el proyecto, reduce el tamaño total de la imagen final al eliminar la necesidad de usar los mismos archivos en la imagen diferente ya que ahora solo hay una imagen final.

Para concluir, en este artículo discutimos cómo usar compilaciones de múltiples etapas de Docker para usar y heredar múltiples bases y personalizar capas de imagen en un solo archivo docker

Publicación traducida automáticamente

Artículo escrito por iamrj846 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *