对于特定的 docker 映像(基于 alpine),我想运行一些自定义代码后容器启动。我希望该代码位于容器内,因此它易于使用并且一切都是独立的。通常我会覆盖容器的入口点或命令,但在这种情况下这是不可能的。
我的解决方案:
docker-compose.yml
volumes:
- ./entrypoint-custom.sh:/entrypoint-custom.sh:ro
entrypoint: /entrypoint-custom.sh # override Dockerfile default of '/someapp'
entrypoint-custom.sh
#!/bin/sh
# custom pre-start code
# ...
# custom post-start code
(sleep 10; echo I run after start) & \
exec /someapp "$@" # '/someapp' is container's actual executable, from image's original ENTRYPOINT
这样可行。并且使用exec
手段信号(例如用于日志轮换)被正确发送到/someapp
可执行文件。如果我检查容器的日志 ( docker logs someapp
),那么它会显示应用程序照常启动,一段时间后,我的延迟任务会打印到输出。
理论上,我可以echo
用我想要的任何启动后逻辑来替换它。
担忧:
- 如果我执行到容器中并运行
ps
,它仍然显示12 root 0:00 [entrypoint-cust]
- 我不确定后果? - 这种方法会产生任何意想不到的后果吗?