Dockerfile: ENTRYPOINT 和 CMD

4

例如,在 postgres 镜像的 Dockerfile 中(https://github.com/docker-library/postgres/blob/master/10/Dockerfile),在最后定义了容器的启动方式:

ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 5432
CMD ["postgres"]

如果我理解正确,参数postgres被传递到docker-entrypoint.sh中,因此脚本中的$1将替换为postgres并执行脚本。现在我的问题是,如果我可以基于postgres镜像(FROM postgres)定义自己的Dockerfile,但覆盖基础Dockerfile的CMD并实现在启动时首先执行一个命令,然后再使用postgres参数执行docker-entrypoint.sh吗?类似这样:
FROM postgres
...
CMD <my-command> && [“postgres”]
2个回答

3
您可以创建自己的my-entrypoint.sh文件。
$ cat my-entrypoint.sh
#!/bin/bash

#do what you need here e.g. <my-command>

#next command will run postgres entrypoint will all params
docker-entrypoint.sh "$@"

您的Docker文件将如下所示

FROM postgres

# your stuff

ENTRYPOINT ["my-entrypoint.sh"]
EXPOSE 5432
CMD ["postgres"]

0

是的,你可以这样做。

对于 Dockerfile 中的 CMD 命令,有三种可能的语法。

摘自

https://docs.docker.com/engine/reference/builder/#cmd

CMD ["executable","param1","param2"] (exec形式,这是首选形式) CMD ["param1","param2"] (作为ENTRYPOINT的默认参数) CMD command param1 param2 (shell形式)

因此,您可以使用任何一种形式来完成您想要的操作,最后一种shell形式似乎很适合

您还可以启动一个执行所有操作的shell脚本


我认为有一些误解。或者你能否举个例子来说明一下我想要实现的语法? - Palmi
请阅读以下内容:https://dev59.com/mmEi5IYBdhLWcg3wK5rd?rq=1 - user2915097
PostgreSQL 的根用户权限被禁止执行。 - Palmi
我猜您还没有创建一个非特权用户,因此您的Dockerfile没有USER指令。您应该发布您的Dockerfile。 - user2915097
这个形式 "CMD command param1 param2 (shell form)" 是否也是 ENTRYPOINT 的参数呢? - Webwoman
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接