Comandos RUN, CMD y ENTRYPOINT en el Dockerfile
En los últimos días he recibido varias preguntas relacionados con los comandos RUN, CMD y ENTRYPOINT sobre su funcionalidad dentro de un Dockerfile, por lo que he decido escribir un breve post sobre estos comandos.
RUN
El comando RUN se ejecuta cuando se está construyendo una imagen personalizada para realizar una acción, creando una capa nueva. Este comando tiene el siguiente formato:
RUN comando
Cuando se ejecuta con esta sintaxis se pasa como parámetro a la Shell del sistema. Dependiendo del sistema operativo es:
- · Linux — > bash (/bin/bash -c)
- · Windows — > cmd (cmd/s/c)
Otra forma de utilizar este comando es:
RUN [“ejecutable”, “parametro1”, …]
Con esta forma no se invoca a la Shell del sistema por defecto, sino que se permite ejecutar programas que la imagen contenga. Una cosa a recordar, es que tenemos que poner los parámetros entre comillas. En el siguiente ejemplo con el comando Get-Service de powershell se recuperan todos los servicios Windows que se están ejecutando en la máquina.
RUN [“Powershell”, “Get-Services”, “*”]
Una cosa importante sobre este método, y es que podemos vernos en la situación que se quiere provocar un error y que la creación de la imagen se interrumpa cuando el comando que se está ejecutado produzca un error. Para conseguir este resultado se tiene que utilizar el parámetro -o pipefail (no todos los Shell lo soportan)
RUN [“/bin/bash”, “-c”, “set -o pipefail && wget –o https://misitio/”]
CMD
Este comando se encarga de pasar valores por defecto a un contenedor. Entre estos valores se pueden pasar ejecutables. Este comando tiene tres posibles formas de pasar los parámetros:
CMD [“ejecutable”, “parametro1”, “parametro2”, …]
Esta es la forma más recomendable.
CMD [“parametro1”, “parametro2”, ….]
Esta forma se utiliza para pasar parámetros al comando EntryPoint.
CMD Comando paametro1 parametro2
Ecomando se ejecuta en la Shell con los parámetros establecidos.
A diferencia del comando RUN, los comandos que se pasen por medio de este método se ejecutan una vez que el contenedor se ha inicializado, mientras que RUN se utiliza para crear la imagen de un contenedor.
ENTRYPOINT
Este comando se ejecuta cuando se quiere ejecutar un ejecutable en el contenedor en su arranque. Los ejemplos tipo de su uso, son cuando se quiere levantar un servidor web, una base de datos, etc ….
Este comando tiene dos sintaxis:
ENTRYPOINT [“comando”, “Parametro1”, “Parametro2”, …]
Esta es la forma recomendada.
ENTRYPOINT comando parametro1 parametro2
Con esta forma el comando se ejecuta en la Shell del contenedor.
Utilización de varios comandos de forma conjunta
Como se ha comentado anteriormente el comando CMD se puede utilizar para pasar parámetros al comando ENRYPOINT. Una posible forma de realizarlo es:
ENRYPOINT [“Powershell”, “Get-Services”]
CMD [“MySql]
En el ejemplo, se está invocando al comando Get-Services para recuperar información de los servicios Windows y como en el comando CMD se está indicando el servicio en concreto del que se quiere recuperar la información que en este caso es del servicio Windows de MySql.
Nota: cuando los comandos o parámetros son pasados entre corchetes siempre van entre comillas. Esto es porque el comando correspondiente lo interpreta como una cadena JSON.
Espero que con esta breve explicación, quede más claro el uso de estos comandos. Hasta otra