OpenShift脚本部署:无需sleep触发start-build的实现方法
解决镜像流未就绪时触发构建的问题
我明白你遇到的困扰:创建镜像流后立即触发构建会失败,因为OpenShift还没完成外部镜像的拉取和镜像流状态更新。不用sleep这种不太可靠的方式,咱们可以用oc wait精准等待镜像流就绪,有两种靠谱的方法:
方法1:等待镜像流标签完成解析
直接针对nginx-114-rhel7:latest这个镜像流标签,等待它进入Resolved状态——这个状态表示标签已经成功关联到实际的镜像文件:
oc wait imagestreamtag/nginx-114-rhel7:latest -n ns --for=condition=Resolved --timeout=60s
这里设置了60秒超时,你可以根据自己集群的网络情况调整,比如改成120秒都没问题。
方法2:等待镜像流状态出现有效镜像
如果第一种方法在你的集群里不生效,还可以通过检查镜像流的status字段,确认latest标签下已经有可用的镜像引用:
oc wait imagestream/nginx-114-rhel7 -n ns --for=jsonpath='{.status.tags[?(@.tag=="latest")].items[0].dockerImageReference}'!='' --timeout=60s
这个命令会一直等,直到镜像流的状态里出现具体的Docker镜像地址,确保拉取完成。
把这个等待命令替换掉脚本里的sleep 5就行,完整脚本如下:
# 开启错误终止,命令失败时脚本直接退出 set -e echo "创建nginx基础镜像流..." oc create -f is-nginx.yaml echo "创建源码输出镜像流..." oc create -f is-repo.yaml echo "创建构建配置..." oc create -f bc-repo.yaml echo "等待nginx镜像流就绪..." oc wait imagestreamtag/nginx-114-rhel7:latest -n ns --for=condition=Resolved --timeout=60s echo "触发构建并等待完成..." oc start-build bc/bc-rp --wait
OpenShift应用部署脚本编写指南
针对这种“外部镜像+Git源码”构建应用的场景,我整理了一套靠谱的脚本编写规范,帮你避免类似的依赖问题:
1. 按依赖顺序创建资源
资源之间有明确的依赖关系,必须按顺序来:
- 先搞基础镜像的ImageStream(比如你的
nginx-114-rhel7),因为BuildConfig要用到它 - 再创建源码输出的ImageStream(
is-rp),毕竟BuildConfig的输出要指向它 - 最后创建BuildConfig
2. 给依赖资源加就绪等待
千万别默认资源创建后就立刻能用!对有外部依赖的资源(比如从外部仓库拉取镜像的ImageStream),一定要等它就绪:
- 像前面说的,用
oc wait等镜像流标签解析完成 - 如果要确保BuildConfig被集群正确识别,也可以等它的
Ready状态:oc wait buildconfig/bc-rp -n ns --for=condition=Ready --timeout=30s
3. 构建触发与结果校验
- 用
oc start-build的时候加上--wait,让脚本等构建完成再往下走 - 还可以加一步构建结果校验,确保构建成功完成:
# 获取最新的构建名称 LATEST_BUILD=$(oc get builds -l build=rp -o name | head -1) # 等待构建完成 oc wait $LATEST_BUILD -n ns --for=condition=Complete --timeout=120s
4. 脚本健壮性优化
- 加上
set -e,任何命令失败脚本直接退出,避免错误扩散 - 给所有等待命令加超时,防止脚本无限挂着
- 加一些echo日志,方便调试的时候知道哪一步出问题
5. 更简洁的替代方案:OpenShift模板
如果想让部署更简洁,可以把所有资源打包成OpenShift Template。这样只需要执行oc process生成资源,再用oc create创建,模板会自动处理资源的创建顺序。不过要注意,镜像流的拉取仍然需要手动等待,除非你在模板里加初始化钩子。
内容的提问来源于stack exchange,提问作者cogitoergosum
相关产品推荐
相关产品推荐

