与docker文件中的CMD和ENTRYPOINT混淆

我已经知道,在dockerfile中,当提供ENTRYPOINT和CMD时,CMD中的值将作为ENTRYPOINT的默认参数,然后当运行带有附加参数的容器时,附加参数将replacedockerfile中CMD的值。

但是当我看到mongodb的dockerfile时,我感到困惑,它的dockerfile的入口点和cmd部分:

ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 27017 CMD ["mongod"] 

我知道当我运行docker run mongo:latest这将是docker-entrypoint.sh mongod ,但是当我运行docker run mongo:latest --auth ,为什么它可以正确运行? 是不是docker-entrypoint.sh --auth ? 因为 – --auth将取代mongod ,所以为什么我运行docker run mongo --auth但它工作正常?

mongod Dockerfile引用了docker-entrypoint.sh
那个脚本docker-entrypoint.sh从testing开始,如果第一个参数以' - '开头(如' --auth '):

 if [ "${1:0:1}" = '-' ]; then set -- mongod "$@" fi 

所以争论变成了mongod --auth ,而不仅仅是 – --auth

含义:

  • 如果必须 mongod 之后传递任何参数,则在使用docker run时,不必先inputmongod :它将在docker-entrypoint.sh添加
  • 如果在mongod之后没有任何参数要传递,则不必inputmongodCMD会将它提供给ENTRYPOINT docker-entrypoint.sh