问题分析
最近公司的Harbor仓库使用Amazon S3。docker在push和pull镜像会出现失败的情况,主要原因是公司内网某些网段无法访问acc.gz.test.cn。
|
|
本来该问题的解决方法比较简单,在内网找一个能够访问acc.gz.test.cn的网关,通过Nginx代理,在不能访问的网段配置Hosts文件即可即可。然而考虑到用户的使用习惯,还是决定解决一下。
通过错误信息,可以判断docker在push或者pull的时候,发生了重定向的操作。重定向的Location就是报错信息中的
查看nginx的日志信息,发现在访问Registry的V2接口的时候,有返回307的响应。
那么,在Harbor的nginx这里做一些手脚,当返回的响应是307的时候,修改Location字段,将acc.gz.test.cn替换为其他可以被DNS解析的域名,将该域名代理到acc.gz.test.cn。
定制Nginx
因为需要修改HTTP响应,Harbor自带的Nginx是不行的,需要使用openresty。
首先,修改docker-compose.yml 文件。
其次,修改common/templates/nginx/nginx.https.conf。将acc.gz.test.cn 替换为其他可在内网解析域名,例如 acc-test.gz.test.cn。
|
|
接下来,不要忘了修改https的证书位置。Harbor默认将nginx的证书挂载到/etc/nginx/cert/。但是没有提供修改的方式,可以执行完./install 或者 ./prepare 之后,人工修改证书挂载到openresty中的位置 。修改./common/config/nginx/nginx.conf 。
最后,重启harbor 。此时不要再执行./install 或 ./prepare
代理
其中,需要注意设置正确的Host proxy_set_header Host acc.gz.test.cn;