lunes, 11 de enero de 2021

DockerFile

Vamos a ver como crear una nueva imagen a través del fichero Dockerfile.

Recordemos que Dockerfile es simplemente un fichero de texto que nos permite definir las instrucciones a seguir por Docker para construir una imagen.

Deben estar guardados dentro de un build context (directorio el cuál contiene todos los archivos necesarios para construir nuestra imagen). El nombre del fichero es Dockerfile sin extensión.

Una buena práctica es crear el archivo .dockerignore que nos ayudá a definir lo que realemente necesita el directorio de contexto . Con este archivo, puede especificar ignorar reglas y excepciones de estas reglas para archivos y carpetas, que no se incluirán en el contexto de compilación y, por lo tanto, no se empaquetarán en un archivo ni se cargarán en el servidor Docker.

Ejemplo sencillo de un archivo Dockerfile:


FROM ubuntu

ADD . /app

RUN apt-get update RUN apt-get upgrade -y

RUN apt-get install -y nodejs ssh mysql

RUN cd /app && npm install

# esto debería iniciar tres procesos, mysql y ssh

# en segundo plano y node app en primer plano

CMD mysql & sshd & npm start

Instrucciones que podemos usar para crear un Dockerfile:

FROM — Especifica la base para la imagen.

ENV — Establece una variable de entorno persistente.

ARG — Permite definir una variable usable en el resto del Dockerfile con la sintaxis ${NOMBRE_DEL_ARG}

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

COPY — Copia archivos y directorios al contenedor.

ADD — Lo mismo que COPY pero con la funcionalidad añadida de descomprimir archivos .tar y la capacidad de añadir archivos vía URL.

WORKDIR — Indica el directorio sobre el que se van a aplicar las instrucciones siguientes.

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

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

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

LABEL — Nos permite aportar meta-datos a la imagen.

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

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

SHELL — Permite especificar el uso de otra terminal, como zsh, csh, tcsh, powershell, u otras..

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

HEALTHCHECK — Indica a Docker una manera de testear el contenedor para verificar que sigue funcionando correctamente.

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.