我正在使用自动化 (ansible) 来部署 dockerised 应用程序 (gitea)。该应用程序在其 docker 中运行 s6入口点。
我想运行我自己的脚本:
- 在容器第一次加载之后(文件和数据库已经准备好了)
- 最多一次
选项 1:
我想添加一个脚本/etc/s6/custom/run
并将我的内容放入其中。但它会不断重新启动,并且无法保证顺序。
选项 2:
我读了文档显示s6-svc
了-O
最多运行一次服务的开关。但我无法以自动方式使用它,而且它可能在其他 s6 服务运行之前运行。
因此我想到了这个:
- 添加
/etc/s6/custom/run
脚本 - 检查应用程序是否“准备就绪”
- 如果不是:它不执行任何操作并退出
- 如果是,它就会完成它的工作,然后创建一个
/etc/s6/custom/down
文件表示不应重新启动
问题:
问题出在“否”的情况:直到容器运行,该自定义脚本将重新启动多次。
是否有可能延迟重新启动它,或者有更好的方法?
答案1
我的解决方案是,假设容器中的 s6 的服务位于/etc/s6/
:
docker-compose.yml
:
volumes:
- ./data:/data # a mapped or named volume
- ./run:/etc/s6/custom/run:ro
run
:
#!/bin/sh
# ensure not run (successfully) before
if [ -f /data/custom-init-performed ]; then
echo 'INFO: custom init already performed'
s6-svc -D /etc/s6/custom # prevent s6 from restarting service
exit 0
fi
# ensure container healthy
# if you're using healthchecks then use whatever url is applicable here
# if not, use another approach to determine whether container is ready
until [ $(curl -sf http://localhost:3000/api/healthz | grep -E '^ "status": "pass",$' | wc -l) = 1 ]; do
echo 'WARN: container not healthy yet, will retry...' >&2
sleep 5
done
# do once-only init work
# ...
# prevent script's core logic from running again
touch /data/custom-init-performed
# prevent s6 from restarting service
s6-svc -D /etc/s6/custom
exit 0