将脚本嵌入到 docker 容器中以在主进程启动后运行

将脚本嵌入到 docker 容器中以在主进程启动后运行

对于特定的 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]- 我不确定后果?
  • 这种方法会产生任何意想不到的后果吗?

相关内容