Diferencias entre RUN, CMD y ENTRYPOINT
Entender las instrucciones CMD, RUN y ENTRYPOINT en un fichero Dockerfile es fundamental. Estas tres instrucciones definen cómo se construye y ejecuta tu contenedor.
Si estás containerizando aplicaciones, entender las instrucciones RUN, CMD y ENTRYPOINT en un fichero Dockerfile es fundamental.
Con estas instrucciones defines cómo se construye y ejecuta tu contenedor, impactando en el tamaño de la imagen creada y la flexibilidad a la hora de cambiar una configuración.
Maneras de definir los parámetros de las instrucciones
Podemos definir los parámetros de las instrucciones RUN, CMD y ENTRYPOINT de dos maneras diferentes: exec form y shell form.
Shell form
Utiliza una shell (/bin/sh -c) para ejecutar los comandos definidos como una cadena de texto. Las características principales son:
Permite usar variables de entorno: $HOME, $PATH
Permite operadores shell: &&, ||, pipes |, redirecciones
El PID 1 es el shell, no tu aplicación
No procesa señales correctamente (problemas con SIGTERM)
Puedes definir el uso de una shell diferente con la instrucción SHELL.
CMD comando parametro1 parametro2
RUN apt-get updateExec form
Ejecuta el comando directamente sin una shell intermedia. Se utiliza un array JSON para definir cada comando, flag o argumento. Las características principales son:
Tu aplicación es PID 1
Procesa señales correctamente (SIGTERM, SIGKILL)
NO expande variables de entorno directamente
NO permite operadores shell
Más eficiente (un proceso menos)
CMD [”ejecutable”, “parametro1”, “parametro2”]
RUN [”apt-get”, “update”]RUN
Nos permite ejecutar comandos en la fase de construcción de la imagen (docker build). Cada ejecución crea una nueva capa en la imagen.
Se utiliza para instalar dependencias, compilar aplicaciones o aplicar configuraciones.
RUN dotnet restore
RUN apt-get update && apt-get install -y curlCMD
Define el comando y argumentos predeterminados al iniciar el contenedor. Se puede sobreescribir pasando argumentos al comando docker run.
CMD [”dotnet”, “MiApp.dll”]ENTRYPOINT
Te permite configurar el contenedor como un ejecutable. Puedes añadir argumentos adicionales al final del mismo con el comando docker run <ARGS>. Se puede sobreescribir con el parámetro --entrypoint.
ENTRYPOINT [”dotnet”, “MiApp.dll”] Conclusión
Utiliza RUN para instalar paquetes, configurar el sistema o compilar tu código.
Utiliza CMD para aplicaciones donde necesites flexibilidad, comandos que puedan cambiar o para definir los parámetros de ENTRYPOINT.
Utiliza ENTRYPOINT para configurar tu contenedor como un ejecutable.
Puedes combinar el uso de ENTRYPOINT y CMD para tener una mayor flexibilidad: ENTRYPOINT define el comando fijo y CMD te proporciona los argumentos por defecto, permitiendo que puedan ser modificados.
Ejemplo de fichero Dockerfile para compilar y ejecutar una aplicación dotnet:
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
WORKDIR /app
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
WORKDIR /src
COPY . .
RUN dotnet restore “MiApi.csproj”
RUN dotnet publish “MiApi.csproj” -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=build /app/publish .
ENTRYPOINT [”dotnet”, “MiApi.dll”]
CMD [”--urls”, “http://0.0.0.0:8080”]Referencias
https://docs.docker.com/reference/dockerfile/
https://docs.docker.com/build/building/best-practices/
