docker使用多个命令运行entrypoint



我如何在执行多个命令的docker run中有一个入口点?比如:

docker run --entrypoint "echo 'hello' && echo 'world'" ... <image>

我试图运行的图像,已经在Dockerfile中设置了一个入口点,所以像下面这样的解决方案似乎不起作用,因为它看起来我的命令被忽略了,只有原始的入口点被执行

docker run ... <image> bash -c "echo 'hello' && echo 'world'"

在我的用例中我必须使用docker run命令。改变Dockerfile的解决方案是不可接受的,因为它不在我的手中

作为样式点,如果您的图像具有可以覆盖的CMD,则这将变得非常容易。如果您只需要运行一个命令而不需要初始设置,请将其设置为CMD而不是ENTRYPOINT:

CMD ./some_command  # not ENTRYPOINT

如果您需要进行一些初始设置,然后启动主命令,那么将ENTRYPOINT设置为一个shell脚本,并以特殊指令exec "$@"结尾。CMD将作为参数传递给它,这一行将用该命令替换shell脚本。

#!/bin/sh
# entrypoint.sh
... do first time setup, run database migrations, set variables ...
exec "$@"
# Dockerfile
...
ENTRYPOINT ["./entrypoint.sh"] # MUST be JSON-array syntax
CMD ./some_command             # as before

如果您做了这些事情,那么您可以使用您的初始docker run表单。这将取代CMD,但保持ENTRYPOINT不变。在包装脚本的情况下,您的备用命令将作为exec "$@"命令运行,因此所有的首次设置将首先完成。

# Assuming the image correctly honors the CMD
docker run ... 
image-name 
sh -c 'echo "foo is $FOO" && echo "bar is $BAR"'

如果你真的不能这样做,你可以覆盖docker run --entrypoint。这将运行而不是图像的入口点(如果您想要图像的入口点,您必须自己运行它),语法很笨拙:

# Run a shell command instead of the entrypoint
docker run ... 
--entrypoint /bin/sh 
image-name 
-c 'echo "foo is $FOO" && echo "bar is $BAR"'
注意,--entrypoint选项出现在图像名称之前,其参数出现在图像名称之后。

最新更新