Curso Docker - 17. Diferencias entre CMD y ENTRYPOINT en Docker
Existen dos directivas en Dockerfile
para especificar qué comando se va a ejecutar por defecto cuando generemos las imágenes Docker: CMD
y ENTRYPOINT
.
Una explicación sencilla para ver sus diferencias es que si únicamente especificamos CMD
, el ENTRYPOINT
será el predeterminado, es decir, /bin/bash -c
. Si se utilizan ambos, entonces el ENTRYPOINT
especifica el ejecutable del proceso contenedor y CMD
se utilizará como los parámetros de dicho ejecutable.
Vamos a ver un ejemplo:
FROM ubuntu:18.04
En este caso, se está utilizando el ENTRYPOINT
predeterminado, es decir, /bin/bash -c
. Especificando el CMD
como date
, lo que estaremos ejecutando es /bin/bash -c date
.
Ahora vamos a ejecutar los comandos:
$ docker build -t test .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM ubuntu:18.04
---> d131e0fa2585
Step 2/2 : CMD ["date"]
---> Running in a7c7815468f3
Removing intermediate container a7c7815468f3
---> 60c6d1a8974c
Successfully built 60c6d1a8974c
Successfully tagged test:latest
$ docker run test
Fri May 10 16:46:41 UTC 2019
La directiva CMD
puede modificarse a la hora de hacer el docker run
, y en este caso se utilizará el parámetro que le vamos a pasar:
docker run test hostname
Si especificamos la directiva ENTRYPOINT
, Docker utilizará ese ejecutable y CMD
serán los parámetros:
FROM ubuntu:18.04
Si volvemos a generar la imagen y ejecutar un contenedor Docker:
$ docker build -t test .
Sending build context to Docker daemon 2.048kB
Step 1/3 : FROM ubuntu:18.04
---> d131e0fa2585
Step 2/3 : ENTRYPOINT ["echo"]
---> Running in 6238c28a1258
Removing intermediate container 6238c28a1258
---> bfde3b8fac6e
Step 3/3 : CMD ["Curso de Docker en Geeky Theory"]
---> Running in 62e60fbb2f14
Removing intermediate container 62e60fbb2f14
---> 1bf7c1314bb3
Successfully built 1bf7c1314bb3
Successfully tagged test:latest
$ docker run test
Curso de Docker en Geeky Theory
Podemos sobrescribir también el CMD
:
$ docker run test Hola
Hola
Y además, también podemos pasar el ENTRYPOINT
como parámetro con --entrypoint
:
docker run --entrypoint=hostname test