You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

本地服务器连接Azure容器注册表:Webhook创建及中间件需求咨询

解决Azure容器注册表镜像拉取+Webhook配置问题

一、本地服务器搭建Webhook的两种实用方式

本地Webhook本质是一个能接收ACR POST请求的HTTP服务,用任意工具都能实现,下面给出两种常见方案:

1. Python Flask快速实现

适合有开发基础的场景,几行代码就能完成:

from flask import Flask, request, jsonify
import subprocess

app = Flask(__name__)

# 替换为你的ACR名称和本地镜像存储路径
ACR_NAME = "your-acr-name"
LOCAL_SAVE_PATH = "/opt/local-images"

@app.route('/acr-webhook', methods=['POST'])
def acr_webhook_handler():
    payload = request.get_json()
    if not payload or 'target' not in payload:
        return jsonify({"status": "fail", "msg": "无效请求内容"}), 400
    
    # 解析ACR传来的镜像信息
    repo = payload['target']['repository']
    tag = payload['target']['tag']
    full_image = f"{ACR_NAME}.azurecr.io/{repo}:{tag}"

    # 拉取镜像到本地
    try:
        # 若本地未持久化ACR登录,可添加az acr login命令(需提前安装Azure CLI)
        # subprocess.run(["az", "acr", "login", "--name", ACR_NAME], check=True)
        subprocess.run(["docker", "pull", full_image], check=True)
        # 可选:将镜像保存为tar包到本地指定目录
        subprocess.run(["docker", "save", "-o", f"{LOCAL_SAVE_PATH}/{repo.replace('/', '-')}-{tag}.tar", full_image], check=True)
        return jsonify({"status": "success", "msg": f"镜像 {full_image} 拉取完成"}), 200
    except subprocess.CalledProcessError as e:
        return jsonify({"status": "fail", "msg": str(e)}), 500

if __name__ == '__main__':
    # 开放公网可访问的端口,需确保服务器防火墙/云安全组放行该端口
    app.run(host='0.0.0.0', port=5000, debug=False)
  • 部署后,你的Webhook地址为http://[服务器公网IP]:5000/acr-webhook,建议配置SSL证书使用HTTPS(ACR优先支持HTTPS)
  • 注意:要确保本地服务器能正常访问Azure容器注册表的出站网络权限

2. NGINX+Shell脚本组合

适合无开发基础的场景,用NGINX接收请求,触发Shell脚本执行拉取:

  1. 配置NGINX的SSL站点(ACR优先HTTPS):
server {
    listen 443 ssl;
    server_name your-server-domain.com;

    ssl_certificate /etc/nginx/certs/fullchain.pem;
    ssl_certificate_key /etc/nginx/certs/privkey.pem;

    location /acr-webhook {
        fastcgi_pass unix:/var/run/fcgiwrap.socket;
        fastcgi_param SCRIPT_FILENAME /usr/local/bin/acr-pull-script.sh;
        fastcgi_param CONTENT_TYPE $content_type;
        fastcgi_param CONTENT_LENGTH $content_length;
        fastcgi_pass_request_body on;
    }
}
  1. 编写拉取脚本/usr/local/bin/acr-pull-script.sh(记得添加执行权限chmod +x):
#!/bin/bash
# 读取ACR发送的请求体
read -r payload
# 用jq解析镜像信息(需提前安装jq:apt install jq)
image_repo=$(echo "$payload" | jq -r '.target.repository')
image_tag=$(echo "$payload" | jq -r '.target.tag')
acr_name="your-acr-name"
full_image="${acr_name}.azurecr.io/${image_repo}:${image_tag}"

# 登录ACR并拉取镜像
az acr login --name "$acr_name"
docker pull "$full_image"
# 创建本地存储目录并保存镜像
mkdir -p /opt/local-images
docker save -o "/opt/local-images/${image_repo//\//-}-${image_tag}.tar" "$full_image"

二、连接ACR是否需要中间件?

分两种场景判断:

  • 不需要中间件:如果你的本地服务器有公网IP,且出站网络能正常访问Azure服务,直接在ACR中配置Webhook指向本地地址即可,无需额外中间件。
  • 需要中间件的场景:
    1. 本地服务器处于私有网络(无公网IP):ACR无法直接访问本地Webhook,需要使用Azure的API Management或Logic Apps作为转发层,ACR先将事件发送到中间件,再通过VPN/Express Route转发到本地服务器。
    2. 安全合规要求:若不允许本地Webhook暴露到公网,可以使用Azure Event Grid搭配私有端点,结合本地事件订阅服务接收事件,这种情况也需要中间组件桥接公网与内网。

最后:配置ACR的Webhook

  1. 登录Azure门户,进入你的容器注册表
  2. 左侧菜单选择「Webhooks」→「添加」
  3. 填写配置信息:
    • 名称:自定义(比如local-pull-trigger)
    • 服务URI:你的本地Webhook地址(HTTPS优先)
    • 触发器:选择image push(当有新镜像推送至ACR时触发拉取)
    • 内容类型:选择application/json
  4. 创建完成后,ACR会发送测试请求,确保本地Webhook返回200状态码即为配置成功

内容的提问来源于stack exchange,提问作者JBA

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 05:45:40