C execve (2)函数将当前进程替换为一个新进程;新进程保留有效用户 ID 等属性,并且具有相同的进程 ID。Bourne shell 包括一个exec
做同样事情的内置程序。
Docker 映像中的一个常见模式是使用入口点包装脚本进行首次设置。如果容器同时具有入口点和命令,则命令将作为参数传递给入口点。因此,您可以编写如下脚本:
#!/bin/sh
# Do whatever's needed to get the license
/opt/myapp/bin/get_license
# Then run the command part
# exec replaces this script, so it will have pid 1
# "$@" is the command-line arguments
exec "$@"
在 Dockerfile 中,将 设置ENTRYPOINT
为此包装器,并将 设置CMD
为运行真正的服务。
# Run the script above
# ENTRYPOINT must have JSON-array syntax in this usage
ENTRYPOINT ["/opt/myapp/bin/start_with_license"]
# Say the normal thing you want the container to do
# CMD can have either JSON-array or shell syntax
CMD ["/opt/myapp/bin/server", "--foreground"]