作为风格点,如果您的图像具有CMD
可以被覆盖。如果您只需要运行一个命令而无需进行初始设置,请将其设为CMD
而不是ENTRYPOINT
:
CMD ./some_command # not ENTRYPOINT
如果您需要进行一些初始设置然后启动主命令,请执行ENTRYPOINT
是一个以特殊指令结尾的 shell 脚本exec "$@"
. The 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
选项来了before图像名称及其参数来自after图像名称。