仅在 docker 容器中运行一次自定义 s6 脚本

仅在 docker 容器中运行一次自定义 s6 脚本

我正在使用自动化 (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

相关内容