Crear usando Dockerfile
Give a sysadmin an image and their app will be up-to-date for a day, give a sysadmin a Dockerfile and their app will always be up-to-date
Dockerfile
es un archivo de texto que contiene un conjunto de instrucciones o comandos para la creación de una imagen docker. Llamando a la función docker build
se leen las instrucciones del Dockerfile y se construye una imagen que se guardará en el repositorio local.
Uso de Dockerfile
Para la construcción de una imagen se utiliza el comando docker build ${CONTEXT}
.
El ${CONTEXT}
son todos los archivos que necesita el Dockerfile para construir la imagen; puede ser una carpeta de nuestra propia máquina o una URL de un repositorio git.
El proceso de build
lo ejecuta Docker Daemon y no el utilitario docker. Todo el ${CONTEXT}
es enviado repulsivamente al docker daemon, por lo que no es recomendable utilizar un path con demasiados archivos, ya que todos serán enviados.
El archivo Dockerfile
debe estar localizado en el raíz del ${CONTEXT}
También se puede utilizar un archivo .dockerignore
para especificar los archivos y carpetas que deben ser excluidos del proceso de construcción de la imagen y que no serán enviados al docker daemon, lo que mejorará la performance del proceso de build
.
Build
El Dockerfile
siempre parte de una imagen creada, mediante la instrucción FROM
.
Con esta sola instrucción ya podemos crear una imagen, utilizando como ${CONTEXT}
el directorio actual:
Es posible indicar la ubicación del Dockerfile con el argumento -f
:
También podemos ponerle nombre o etiquetar la imagen a la vez que la construimos utilizando el argumento -t
y el nombre que le daremos, en el formato -t ${tag}:${version}
:
Una vez construída podemos revisar que la imagen esté en nuestro repositorio
Estructura del Dockerfile
El formato del archivo Dockerfile es:
La INSTRUCCION no es case-sensitive pero por costumbre se suele usar en mayúscula.
El orden de las instrucciones es importante ya que debe seguir el orden del proceso de construcción de la imagen.
Estructura del .dockerignore
El archivo .dockerignore
tiene un formato como el archivo .gitignore
y es un listado por renglón de los archivos o carpetas que son ignorados:
Los asteriscos se utilizan como comodines e incluyen tanto archivos, carpetas y en ese caso las sub-carpetas.
Instrucciones del Dockerfile
FROM
Un Dockerfile válido debe tener este instrucción como su primer instrucción e indica la imagen que se utilizará para construir la nueva imagen. Docker daemon primero verificará si la imagen existe localmente, si no procederá a descargarla de docker hub.
Se puede utilizar de tres formas:
FROM debe ser la primer línea no comentada en el Dockerfile. Se puede utilizar múltiples veces en el mismo Dockerfile. Tanto el tag
como digest
son opcionales y permiten tratar de obtener la imagen exacta, pero de no estar disponible se usará la última (latest
)
MAINTAINER
Permite indicar el autor de la imagen y se utiliza asi:
RUN
Permite indicar comandos que serán ejecutados en una nueva capa sobre la imagen (del FROM) en el proceso de construcción y ese resultado será guardado para pasarlo, opcionalmente, a un siguiente RUN que volverá a crear una nueva capa.
RUN tiene dos formatos: shell o exec:
RUN <comando>
es el formato shell. El comando se ejecutará en un shell que por defecto es /bin/sh -c
de Linux o cmd /S /C
de Windows.
RUN [“ejecutable”, “argumento1”, “argumento2”, “argumento3” …]
Un ejemplo de Dockerfile
hasta ahora, quedaría construido de la siguiente forma:
Creando una imagen con este ejemplo, tendremos la siguiente salida:
LABEL
Esta instrucción incluye metadatos a la imagen en el formato de pares llave-valor:
Y se pueden utilizar múltiples líneas de LABEL:
Y por supuesto que se pueden indicar varios pares de llaves=valor en la misma instrucción LABEL.
Veamos la construcción de una imagen y sus metadatos:
EXPOSE
Esta instrucción informa a Docker que el contenedor escuchará en un determinado puerto cuando esté corriendo.
No significa que el puerto será accesible desde el host. Para construir la red, se debe utilizar el argumento -p
que publicará el punto al correr docker.
ENV
Permite configurar variables de entorno en el contenedor cuando esté corriendo.
Se pueden consultar las declaraciones de ENV con el comando inspect
:
ADD
La instrucción ADD copia nuevos archivos, directorios o archivos remotos (desde una URL) desde un <src>
y los agrega a la imagen en el lugar indicado en <dest>
.
Ejemplos:
En los dos ejemplos de arriba se copian los archivos de los directorios indicados en la carpeta /app/
dentro de la imagen.
Si el <dest>
no finaliza barra al final, se considera un archivo y en el se escribirá el contenido de <src>
.
Si <dest>
no existe, será creado.
Se permite el uso de asteriscos en <src>
como ser arch*
o readm?.txt
.
Si el origen <src>
es un compactado (tar, gzip, bzip2 o xz) la ejecución de ADD lo descompactará dentro de <dest>
.
COPY
COPY es muy similar a ADD: hace lo mismo y tiene el mismo formato.
La diferencia es que COPY no acepta URLs como <src>
y en caso de ser un archivo compactado, no lo descompactará al copiarlo dentro de la imagen.
ENTRYPOINT
Este comando permite especificar un comando que será siempre ejecutado cada vez que se inicie el container.
Tenga en cuenta que solamente un ENTRYPOINT es permitido en el Dockerfile.
CMD
Al igual que ENTRYPOINT permite especificar comandos a ejecutar cuando se inicie el container y también, solamente un CMD es permitido en el Dockerfile.
La característica de CMD es que será omitido en caso de que el contenedor se inicie especificando otro comando.
Si un Dockerfile especifica:
Y construímos la imagen:
Y ejecutamos:
Ahora si creamos un segundo comando, pero indicando un comando:
VOLUME
La instrucción VOLUME creara un punto de montado con el nombre especificado y tendrá el filesystem externo al contenedor
USER
La instrucción USER seguido del nombre
o UID
indica bajo que usuario correrán las instrucciones RUN, CMD o ENTRYPOINT.
WORKDIR
WORKDIR permite indicar el directorio en el cual los comandos de RUN, CMD, ENTRYPOINT, COPY y ADD serán ejecutados. Si el directorio WORKDIR no existe, será creado.
WORKDIR puede ser visto como el home
del contenedor
Ejemplos de Dockerfile
Please see the comments in each Dockerfile example.
Nodejs app Dockerfile example:
Nginx Dockerfile example:
Ejercicios:
1.
Crear un archivo con el nombre index.js
con el siguiente contenido:
Crear un archivo con el nombre Dockerfile
con el siguiente contenido.
Con el comando build
construimos la imagen que seguirá el script configurado en el Dockerfile que se busca en el directorio actual con el último punto
Con el comando docker image ls
se puede ver la imagen recién creada:
Referencias:
Última actualización