作为一个样式点,如果您的图像有一个可以被覆盖的CMD,这将变得非常容易。如果您只需要运行一个没有初始设置的命令,请将其设为 CMD 而不是 ENTRYPOINT:
CMD ./some_command # not ENTRYPOINT
如果您需要进行一些初始设置然后启动主命令,请将ENTRYPOINT 设为以特殊指令exec "$@" 结尾的shell 脚本。 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 选项位于图像名称之前,其参数位于图像名称之后。