如何在OpenShift Online中高效更新DockerHub发布的新版本镜像?
嘿,我来给你分享几个不用删应用重新部署的高效方法,完美契合你提到的通过Image Stream触发更新的需求~
核心前提:用Image Stream关联DockerHub镜像
首先得确认你的应用是通过Image Stream(镜像流)来关联DockerHub目标镜像的,而不是直接硬编码DockerHub的镜像地址。如果之前没这么配置,第一步就得把这个关联搭起来。
方法一:全自动触发更新(一劳永逸)
这个方式能让OpenShift自动盯着DockerHub的镜像更新,一旦有新版本就自动触发应用部署,完全不用手动干预。
创建/配置Image Stream跟踪DockerHub镜像
用oc命令新建Image Stream的话,替换成你的镜像地址就行:oc create is my-app-image --from-image=docker.io/your-username/your-image:latest要是已经有现成的Image Stream,直接更新它的配置,开启定期检查:
oc patch is my-app-image -p '{"spec":{"tags":[{"name":"latest","from":{"kind":"DockerImage","name":"docker.io/your-username/your-image:latest"},"importPolicy":{"scheduled":true}}]}}'这里的关键是
importPolicy.scheduled: true,它会让OpenShift定期(默认15分钟一次,可调整)去DockerHub拉取最新镜像状态。给DeploymentConfig加ImageChange自动触发器
你的应用部署配置(DeploymentConfig)必须关联Image Stream,并且开启自动触发。如果是新建的DeploymentConfig,可以在yaml里加这段:triggers: - type: ImageChange imageChangeParams: automatic: true containerNames: - my-app-container # 替换成你的容器名 from: kind: ImageStreamTag name: my-app-image:latest要是已经有部署了,直接用命令快速添加触发器:
oc set triggers dc/my-app --from-image=my-project/my-app-image:latest -c my-app-container --auto加了这个之后,只要Image Stream检测到DockerHub的新镜像,就会自动更新DeploymentConfig,触发应用滚动更新。
方法二:手动触发即时更新(想更就更)
要是不想等自动检测的周期,或者需要立刻更新到最新镜像,也可以手动操作两步搞定:
手动拉取最新镜像到Image Stream
这条命令会立刻从DockerHub拉取最新镜像,同步到OpenShift的Image Stream里:oc import-image my-app-image:latest --from=docker.io/your-username/your-image:latest --confirm触发应用部署更新
如果已经配置了ImageChange触发器,上面一步完成后会自动触发部署。要是没配置,也可以手动触发:# 针对DeploymentConfig oc rollout latest dc/my-app # 针对Deployment(OpenShift 4+常用) oc rollout restart deployment/my-app
几个实用小贴士
- 要是你用的是OpenShift 4+的Deployment(不是旧版的DeploymentConfig),可以把镜像引用改成
imageStreamTag格式(比如image: my-project/my-app-image:latest),之后配合oc rollout restart就能快速更新,或者也可以结合Kubernetes的ImagePullPolicy: Always,不过还是Image Stream的方式更可控。 - 想确认Image Stream有没有抓到新镜像?用这条命令看状态:
看输出里的oc describe is my-app-imageTags部分,能看到最新的镜像ID和更新时间,一目了然。
内容的提问来源于stack exchange,提问作者Konrad Dawydiuk

