Docker-image-as-executable:我应该在CMD还是ENTRYPOINT中执行?

我正在创build一个Docker镜像来初始化我的PostgreSQL数据库。 它看起来像这样:

FROM debian:stretc RUN set -x \ && ... ommitted ... && apt-get install postgresql-client -y COPY scripts /scripts CMD cd /scripts && psql -f myscript.sql 

这很好。 每次我需要初始化我的数据库,我启动容器( docker run --rm my-image )。 psql命令完成后,容器会自动停止并删除(因为--rm )。 所以基本上,我有一个Docker-image-as-executable

但是,我觉得最后一行应该是:

 CMD cd /scripts && psql -f myscript.sql 

要么

 ENTRYPOINT cd /scripts && psql -f myscript.sql 

在我的情况下应该使用哪一个( Docker-image-as-excutable )? 为什么?

你需要使用ENTRYPOINT,如果你需要把它作为“Docker-image-as-executable”

  • RUN执行您在新图层中给出的命令并创build一个新图像。 这主要用于安装新的软件包。

  • CMD设置默认命令和/或参数,但是,当docker运行时,我们可以覆盖这些命令,或者通过命令行绕过默认参数

  • 当你想运行一个容器作为可执行文件时,使用ENTRYPOINT。

入口点和命令都会做同样的事情。 唯一的区别在于,当使用CMD时,您可以更灵活地覆盖从CLI运行的命令。

所以如果你有dockerfile:

 FROM debian:stretc RUN set -x \ && ... ommitted ... && apt-get install postgresql-client -y COPY scripts /scripts CMD cd /scripts && psql -f myscript.sql 

您可以从cli中覆盖dockerfile中定义的CMD以运行不同的命令:

 docker run --rm my-image psql -f MYSCRIPT2.sql 

这将运行在cli中给出的MYSCRIPT2.sql。 你不能用ENRTYPOINT来做到这一点。