docker run 具有多个命令的入口点

Fed*_*ini 7 bash docker dockerfile docker-compose

如何在 a 中拥有一个docker run执行多个命令的入口点?就像是:

docker run --entrypoint "echo 'hello' && echo 'world'" ... <image>
Run Code Online (Sandbox Code Playgroud)

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

docker run ... <image> bash -c "echo 'hello' && echo 'world'"
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*aze 21

CMD作为一个风格点,如果你的图像有一个可以被覆盖的,这会变得容易得多。如果您只需要运行一个命令而不进行初始设置,请将其设置为 ,CMD而不是ENTRYPOINT

CMD ./some_command  # not ENTRYPOINT
Run Code Online (Sandbox Code Playgroud)

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

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

如果你做了这些事情,那么你就可以使用你的初始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"'
Run Code Online (Sandbox Code Playgroud)

如果你实在做不到这一点,你可以覆盖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"'
Run Code Online (Sandbox Code Playgroud)

请注意,该--entrypoint选项位于图像名称之前,其参数位于图像名称之后。