Dockerfile


En este post vamos a aprender la definición y el concepto de un dockerfile, donde veremos cuáles son las instrucciones necesarias y básicas que necesitamos para poder construir una imagen

oscar Escrito por oscar 18 July 2021 2066 0

Acerca del proyecto

En este post vamos a aprender la definición y el concepto de un dockerfile, donde veremos cuáles son las instrucciones necesarias y básicas que necesitamos para poder construir una imagen a partir de este archivo y trabajaremos un poco con la instrucción docker build, para poder compilar el dockerfile y generar una imagen.

Conocimiento previo

Para realizar este proyecto se requiere conocimiento previo de los siguientes temas, si aun no has trabajado con lo que se menciona en la siguiente tabla, allí están los links a los post para que puedas dar un repaso adicional o puedas recordar el conocimiento necesario para poder realizar este proyecto.

Proyecto Descripción
Introducción docker Iniciamos con docker, donde conoceremos los temas que vamos a trabajar en este curso, aprenderemos a usar este gestor de contenedores con todas sus funcionalidades, ademas realizaremos ejercicios prácticos para reforzar el conocimiento aprendido.
¿Qué es un contenedor? ¿Qué es un contenedor de docker?, lo podemos definir como una forma de limitar los recursos para una aplicación, donde solo va a contener sus librerías, configuraciones, entre otros. En este post explicamos a detalle los contenedores.
¿Qué es una imagen en docker? ¿Qué es una imagen en docker?, es un archivo compuesto por múltiples capas, que se utiliza para ejecutar código en un contenedor de docker. En este post aprenderás la definición y como usar las imagenes para crear contenedores.
Docker commit Si queremos persistir los cambios realizados en un contenedor, podemos hacer uso del comando commit, este permite crear una nueva imagen a partir del contenedor y la capa de escritura donde estamos creando las nuevas funcionalidades de la aplicación.
Docker hub, hacer pull y push de imagenes Para descargar una imagen oficial de docker, podemos usar el repositorio público, este repositorio es docker hub. Adicionalmente usaremos los comandos pull y push para poder gestionar las imágenes de docker.

Dockerfile

Para automatizar la creación de imágenes en docker podemos usar un archivo de tipo manifiesto llamado dockerfile, este archivo utiliza un conjunto de instrucciones para describir en que imágenes se basa un contenedor, qué pasos deben seguirse para instalar varias dependencias y aplicaciones, qué archivos deben estar presentes en la imagen, cómo se ponen a disposición de un contenedor, qué puertos deben exponerse y qué comando debe ejecutarse cuando se inicia un contenedor, así como algunas otras cosas.

Recordemos el concepto de imágenes

Como mencioné en el post de imágenes de docker, consisten en una serie de capas de solo lectura, donde estas representan una instrucción de dockerfile. las capas se amontonan unas sobre las otras y cada una añade un nuevo recurso o acción sobre la anterior.

Cuando creamos un nuevo contenedor, estamos añadiendo una capa escribible encima de todas las demás capas de solo lectura, observemos la siguiente imagen:

Formato dockerfile

Dockerfile tiene una estructura y formato para que al compilar el archivo se genere correctamente, observemos como es:

#comentario
INSTRUCCION argumento

Para crear el dockerfile debemos seguir estas reglas para no cometer errores:

  • Las lineas que inicien con un # las tratara como un comentario.
  • La instrucción no distingue entre mayúsculas y minúsculas. Sin embargo, la convención es que estén en MAYÚSCULAS para distinguirlos de los argumentos más fácilmente.
  • Docker ejecuta las instrucciones en el orden puesto, de arriba a abajo, linea a linea en el dockerfile.
  • Un dockerfile debe comenzar con la instrucción FROM ya que especifica la imagen principal donde se va a construir la nueva imagen y contenedor, puede estar precedida por la instrucción ARG para agregar argumentos de compilación.
  • Cada línea de un archivo Dockerfile contiene una instrucción que se ejecuta de manera independiente a las demás y provoca la creación de una nueva capa en la imagen.

Instrucciones

Las variables de entorno son compatibles con la siguiente lista de instrucciones en Dockerfile:[1]

ADD

Permite copiar archivos al directorio de un contenedor, pero con la funcionalidad añadida de descomprimir archivos .tar y la capacidad de añadir archivos vía URL.

COPY

Permite copiar archivos al directorio de un contenedor.

ENV

Sirve para declarar variables de entorno que serán visibles para las siguientes instrucciones y la capa resultante. ENV version=12

EXPOSE

Indica que puerto del contenedor se debe exponer al ejecutarlo. No lo expone directamente.

FROM

Indica la imagen base con la que vamos a empezar para el dockerfile, donde debemos especificar el nombre de la imagen, la version a descargar que por defecto es latest y si se requiere el repositorio de la imagen si no es oficial. Ejemplo: FROM ubuntu:18.04

LABEL

Nos permite aportar meta-datos a la imagen.

STOPSIGNAL

Indica una señal que va a finalizar el contenedor.

USER

Establece el usuario que se va a usar cuando se ejecute cualquier operación posterior con RUN, CMD y ENTRYPOINT.

VOLUME

Crea un directorio sobre el que se va a montar un volumen para persistir datos más allá de la vida del contenedor.

WORKDIR

Indica el directorio sobre el que se van a aplicar las instrucciones o donde se va a trabajar en el contenedor.

ONBUILD

Cuando la imagen donde se encuentra se use como base de otra imagen, va a actuar de trigger y va a ejecutar el comando que le indiquemos.

ENTRYPOINT

Docker tiene un Entrypoint por defecto, /bin/sh -c, que se ejecuta cuando el contenedor está listo. Este comando permite sobreescribirlo.

RUN

Ejecuta el comando especificado. Se usa para instalar paquetes en el contenedor.

CMD

Especifica el comando y argumentos que se van a pasar al contenedor. Se ejecutarán junto con lo indicado en el Entrypoint.

Explicando las funciones

Ya conocemos las instrucciones que podemos usar en un docker file ademas de la definición mínima de este archivo ahora vamos a realizar una serie de ejemplos que nos ayudaran a entender en donde están aplicar cada concepto.

from

Como mencionamos los Dockerfile solo pueden iniciar por dos tipos de instrucciones arg y form, y como sabemos toda imagen necesita de otra imagen base para iniciarse y crear su propio contender y de este instalar y configurar cualquier programa que necesitemos.

from permite incluir una imagen del repositorio de docker o de un repositorio propio los parámetros que requiere son NOMRE_REPOSITRORIO:IMAGEN:VERSION, aunque en algunos casos con solo colocar el nombre oficial de la imagen, esta la descarga del repositorio de docker y la versión lastes que es la ultima creada. Veamos unos ejemplos:

FROM ubuntu:18.04

env

Esta instrucción permite declarar variables de entorno qué podemos utilizar dentro del dockerfile, para ello tenemos dos formas de utilizar las:

ENV KEY VALUE
ENV KEY=VALUE

RUN, CMD y ENTRYPOINT

Run sirve para correr comandos para construir una imagen

FROM python:3.8-alpine
RUN apk add --update vin

Lo que hace la instrucción anterior es construir una image y correr el comando añadir el editor de texto vim.

Ahora CMD es cuando se ejecutan los comandos por defecto cuando se ejecutan un contenedor, por ejemplo

CMD ["ejecutable", "parametro1", "parametro2", …]

También se utiliza para ejecutar un comando por defecto al correr un contenedor, pero no está pensado para que se le pasen argumentos al correr el contenedor. La idea es utilizar entrypoint como si fuera un ejecutable y ejecute un comando por defecto al iniciar el contenedor. Por ejemplo tener contenedores con varias versiones de python.

ENTRYPOINT ["python"]

Referencias

[1] medium https://desarrollofront.medium.com/las-10-instrucciones-imprescindibles-para-crear-un-dockerfile-bb439ff836d9, Consultado junio 2021


Comentario

Debe aceptar antes de enviar