Saltar la navegación

6.2 El fichero Dockerfile

En el apartado anterior hemos visto cómo crear y distribuir mis nuevas imágenes partiendo de un contenedor. Esta forma suele ser la preferida cuando empezamos porque es fácil si tenemos ciertos conocimientos de sistemas y porque no hace falta muchos conocimiento sobre docker y su entorno. Sin embargo este tipo de flujo de trabajo aunque fácil, tiene unos inconvenientes importantes:

  • No se puede reproducir la imagen. Si la perdemos tenemos que recordar toda la secuencia de órdenes que habíamos ejecutado desde que arrancamos el contenedor hasta que teníamos una versión definitiva e hicimos docker commit.
  • No podemos cambiar la imagen de base. Si ha habido alguna actualización, problemas de seguridad etc con la imagen de base tenemos que descargar la nueva versión, volver a crear un nuevo contenedor basado en ella y ejecutar de nuevo toda la secuencia de órdenes.

Frente a estos inconvenientes el enfoque preferido es utilizar ficheros Dockerfile, que son una forma declarativa de construir nuevas imágenes. Este proceso de construcción queda descrito en las siguientes imágenes:

Creación de imágenes con Dockerfile
Juan Diego Pérez Jiménez. Creación de imágenes con Dockerfile (Dominio público)
Proceso de creación y distribución usando docker build
Juan Diego Pérez Jiménez. Proceso de creación y distribución usando docker build (Dominio público)

Si trabajamos así y aunque el proceso de construcción del Dockerfile es costoso al principio, vamos a evitar los dos problemas citados anteriormente:

  • Podremos reproducir la imagen fácilmente ya que en el fichero Dockerfile tenemos todas y cada una de las órdenes necesarias para la construcción de la imagen. Si además ese Dockfile está guardado en un sistema de control de versiones como git podremos, no sólo reproducir la imagen si no asociar los cambios en el Dockerfile a los cambios en las versiones de las imágenes creadas.
  • Si queremos cambiar la imagen de base esto es extremadamente sencillo con un Dockerfile, únicamente tendremos que modificar la primera línea de ese fichero tal y como explicaremos posteriormente.

USO DE DOCKER BUILD

Por lo tanto para construir las imágenes necesitamos un fichero Dockerfile dentro de un contexto, ya sea en mi equipo o un repositorio exterior, y la orden docker build cuya estructura general es la siguiente:

Estructura de la orden docker build

Esta orden tiene muchas opciones pero como estamos acostumbrados a lo largo del curso vamos a ver algunas de las más importantes mediante ejemplos.:

# Construcción de una imagen sin nombre ni versión estando el Dockerfile en el mismo directorio donde se ejecuta docker build

> docker build .

# Construcción de una imagen especificando nombre y versión estando el Dockerfile en el mismo directorio donde se ejecuta docker build (--tag/-t)

> docker build -t  usuario/nombre_imagen:1.0 .

# Construcción de una imagen especificando un repositorio en GitHub donde se encuentra el Dockerfile. Ese repositorio es el contexto de construcción

> docker build -t usuarioDockerHub/nombre_imagen:1.1 https://github.com/...../nombre_repo.git#nombre_rama_git

# Construcción de una imagen usando una variable de entorno estando el Dockerfile en el mismo directorio donde se ejecuta docker build (--build-arg)

> docker build --build-arg user=usuario -t  usuarioDockerHub/nombre_imagen:1.0 .

# Construcción de una imagen sin usar las capas cacheadas por haber realizado anteriormente imágenes con capas similares y estando el Dockerfile en el mismo directorio donde se ejecuta docker build (--no-cache)

> docker build --no-cache -t  usuarioDockerHub/nombre_imagen:1.0 .

# Construcción de una imagen especificando nombre,versión y especificando la ruta al fichero Dockerfile mediante el flag --file/-f

> docker build -t  usuario/nombre_imagen:1.0 -f /home/usuario/DockerProject/Dockerfile

NOTA: Si quiero que la imagen construida sea distribuida mediante DockerHub debo poner como prefijo de la imagen mi nombre de usuario de DockerHub.

Creado con eXeLearning (Ventana nueva)