3.1 Instrucción FROM
Bueno, recuerda que un Dockerfile es un archivo de texto que contiene instrucciones para crear una imagen de Docker. Cada instrucción en el Dockerfile realiza una tarea específica y crea una nueva capa en la imagen. En esta lección, nos centraremos en las principales instrucciones del Dockerfile: FROM, RUN, COPY y CMD, que son clave para crear imágenes funcionales y eficientes de Docker.
La instrucción FROM establece la imagen base desde la cual se creará la nueva imagen. Es la primera instrucción en cualquier Dockerfile y define el punto de inicio para construir la imagen.
Sintaxis
FROM <image>[:<tag>] [AS <name>]
Dónde:
<image>: nombre de la imagen base.<tag>: (opcional) versión de la imagen base. Por defecto, se usalatest.AS <name>: (opcional) asignación de un nombre para esta etapa de construcción (usado en construcción multi-stage).
Ejemplos
Uso de la imagen base Ubuntu:
FROM ubuntu:20.04
Uso de la imagen oficial de Node.js:
FROM node:14
Uso de una construcción multi-stage para optimización:
FROM node:14 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
RUN npm run build
FROM nginx:alpine
COPY --from=builder /app/build /usr/share/nginx/html
En este ejemplo, se usan dos imágenes base. La primera (node:14) se usa para construir la aplicación, la segunda (nginx:alpine) es para crear un servidor ligero que servirá archivos estáticos.
Gracias al uso de la construcción multi-stage, la imagen final contiene solo el conjunto mínimo de archivos y programas (en este caso, Nginx y los archivos estáticos construidos), lo que la hace más ligera y rápida para desplegar.
3.2 Instrucción RUN
La instrucción RUN ejecuta comandos dentro del contenedor y crea una nueva capa en la imagen. Esta instrucción se usa para instalar paquetes, configurar el entorno y ejecutar otros comandos necesarios para preparar la imagen.
Sintaxis:
RUN <command>
Dónde:
<command>: comando que se ejecutará dentro del contenedor.
Ejemplos:
Instalación de paquetes en la imagen Ubuntu:
RUN apt-get update && apt-get install -y curl git
Compilación de código:
RUN gcc -o myapp myapp.c
Combinación de varios comandos
Para reducir la cantidad de capas, el tamaño del image y acelerar la construcción, se recomienda combinar varios comandos en una sola instrucción RUN.
RUN apt-get update \
&& apt-get install -y curl git \
&& rm -rf /var/lib/apt/lists/*
3.3 Instrucción COPY
La instrucción COPY copia archivos y directorios desde el contexto de construcción al sistema de archivos del contenedor. Esto es útil para trasladar código fuente, archivos de configuración y otros recursos al contenedor.
Sintaxis:
COPY <src> <dest>
Dónde:
-
<src>: ruta a los archivos o directorios en el contexto de construcción. <dest>: ruta de destino en el contenedor.
Ejemplos:
Copiar todo el contenido del directorio actual al directorio de trabajo del contenedor:
COPY . /app
Copiar archivos específicos:
COPY package.json /app/package.json
COPY server.js /app/server.js
Uso de .dockerignore
Para excluir archivos innecesarios del proceso de copia puedes usar el archivo .dockerignore, que funciona de manera similar a .gitignore.
node_modules
dist
*.log
3.4 Instrucción CMD
La instrucción CMD define el comando que se ejecutará al iniciar el contenedor. A diferencia de RUN, que se ejecuta en la etapa de construcción, CMD se ejecuta al iniciar el contenedor desde la imagen creada.
Sintaxis:
CMD ["executable","param1","param2"]
O
CMD command param1 param2
Dónde:
- ["executable","param1","param2"]: forma exec, que es preferida para garantizar un manejo correcto de las señales.
- command param1 param2: forma
shell, que ejecuta el comando en un shell.
Ejemplos:
Iniciar una aplicación Node.js:
CMD ["node", "app.js"]
Iniciar un script shell:
CMD /usr/bin/myscript.sh
Diferencia entre CMD y ENTRYPOINT
CMD especifica un comando predeterminado que puede ser reemplazado al iniciar el contenedor. ENTRYPOINT especifica un comando inmutable que siempre se ejecutará al iniciar el contenedor.
Ejemplo de uso de ENTRYPOINT:
ENTRYPOINT ["python", "script.py"]
CMD ["arg1"]
En este ejemplo, ENTRYPOINT inicia un script de Python, y CMD pasa argumentos que pueden ser modificados al iniciar el contenedor.
Ejemplo de Dockerfile con instrucciones esenciales
# Usamos una imagen base de Node.js
FROM node:14
# Configuramos el directorio de trabajo
WORKDIR /app
# Copiamos los archivos package.json y package-lock.json
COPY package*.json ./
# Instalamos las dependencias
RUN npm install
# Copiamos el código fuente de la aplicación
COPY . .
# Especificamos el puerto que usará la aplicación
EXPOSE 3000
# Definimos el comando para iniciar la aplicación
CMD ["node", "app.js"]
GO TO FULL VERSION