搭载OpenVPN的Azure Container Instance无法正常运行问题求助
Azure Container Instance 运行OpenVPN容器无响应问题修复方案
核心根因
- DevOps流水线配置错误:当前
DockerCompose@0任务执行的docker-compose up -d是在Ubuntu构建代理本地启动容器,而非部署到Azure Container Instance(ACI),你实际没有把镜像部署到目标ACI服务 - 镜像标签不匹配:流水线构建推送的镜像标签为
$(Build.BuildId)动态版本号,但docker-compose.yml中写死的镜像标签是v1,拉取的镜像版本不对 - OpenVPN启动逻辑错误:Dockerfile中
CMD使用了shell格式+exec格式的混合错误写法,且OpenVPN加了--daemon参数后台运行,shell不等VPN连接建立就直接执行Python脚本,脚本运行时网络还未就绪 - ACI权限配置缺失:ACI默认不开放
NET_ADMIN权限、不挂载/dev/net/tun设备,需要显式配置特权模式才能运行OpenVPN
具体修复步骤
- 修正Dockerfile启动命令
去掉--daemon参数,用OpenVPN的up脚本机制保证VPN连接建立后再执行业务脚本,示例配置:CMD ["/bin/sh", "-c", "openvpn --config config/fremsyn.ovpn --auth-user-pass config/login.txt --askpass config/password.conf --script-security 2 --up 'sleep 5 && python3 src/cli/getStatus.py'"] - 替换错误的部署步骤
删除现有DockerCompose@0任务,新增Azure CLI任务部署到ACI,参考命令:
其中az container create \ --resource-group RG-ComposeprojectCloud \ --name getstatus-container \ --image composeproject.azurecr.io/getstatus:$(Build.BuildId) \ --registry-login-server composeproject.azurecr.io \ --registry-username $(acr-username) \ --registry-password $(acr-password) \ --cap-add NET_ADMIN \ --allow-privileged true \ --sysctl net.ipv6.conf.all.disable_ipv6=0$(acr-username)和$(acr-password)可以配置为DevOps流水线的保密变量,从ACR的访问密钥中获取 - 统一镜像版本
构建镜像时可同时推送动态版本号和latest/v1固定标签,保证部署时拉取的是最新构建的镜像:
在Docker@2任务的tags配置中新增固定标签:tags: | $(tag) v1 - 可选配置优化
如果OpenVPN服务端有IP白名单限制,提前将ACI所在区域的出口IP段加入白名单;ovpn配置中不要硬编码本地网卡、路由规则,适配Azure网络环境
内容的提问来源于stack exchange,提问作者Martin Petri Bagger
相关产品推荐
相关产品推荐

