Dockerfile:ENTRYPOINT和CMD

Dockerfile:ENTRYPOINT和CMD,docker,dockerfile,Docker,Dockerfile,例如,我在postgres映像()的Dockerfile中看到,容器的启动定义如下: ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 5432 CMD ["postgres"] FROM postgres ... CMD <my-command> && [“postgres”] 如果我理解正确,参数postgres被转移到docker entrypoint.sh中,因此脚本中的$1被替换为postgres,脚本将被执行 现在我

例如,我在postgres映像()的Dockerfile中看到,容器的启动定义如下:

ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 5432
CMD ["postgres"]
FROM postgres
...
CMD <my-command> && [“postgres”]
如果我理解正确,参数
postgres
被转移到
docker entrypoint.sh
中,因此脚本中的
$1
被替换为
postgres
,脚本将被执行

现在我的问题是,我是否可以基于postgres图像(
来自postgres
)定义自己的Dockerfile,但覆盖基本Dockerfile的
CMD
,并完成在启动时首先执行命令,然后使用
postgres
参数执行
docker entrypoint.sh

大概是这样的:

ENTRYPOINT ["docker-entrypoint.sh"]
EXPOSE 5432
CMD ["postgres"]
FROM postgres
...
CMD <my-command> && [“postgres”]
来自postgres的

...
CMD&[“postgres”]

是的,你可以做这样的事

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

摘自

CMD[“executable”、“param1”、“param2”](exec表单,这是首选表单)
CMD[“param1”、“param2”](作为入口点的默认参数)
CMD命令param1 param2(外壳形式)

所以你可以使用任意一个,为了做你想做的事情,shell形式(最后一个)看起来很合适


您还可以启动一个shell脚本来完成所有工作

您可以创建自己的
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 "$@"

我认为这是一个误会。或者,请给出一个我想要实现的语法示例。另外,不允许PostgresSQL的根执行。我猜您没有创建非特权用户,因此Dockerfile没有
user
指令。您应该发布DockerFile,但postgres entrypoint脚本不应该创建此用户(请参阅)