我正在创建一个Docker镜像来初始化我的PostgreSQL数据库。它看起来像这样:
Pi
这很有效。每次我需要初始化我的数据库时,我都会启动容器(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
)。基本上,我有一个 Docker-image-as-executable 。
但是,我很困惑最后一行应该是:
--rm
或
CMD cd /scripts && psql -f myscript.sql
在我的情况下应该使用哪一个( Docker-image-as-excutable )?为什么呢?
答案 0 :(得分:0)
如果需要将其设为“Docker-image-as-executable”,则需要使用ENTRYPOINT
RUN执行您在新图层中提供的命令并创建 一个新的形象。这主要用于安装新包。
CMD设置默认命令和/或参数,但是,我们可以覆盖 这些命令或传入并绕过默认参数 docker运行时的命令行
当您想要将容器作为可执行文件运行时,使用ENTRYPOINT。
答案 1 :(得分:0)
Entrypoint和Command都会做同样的事情。唯一的主要区别在于,当您使用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做到这一点。