私有网络Nexus+GitHub Action+Tailscale构建镜像遇Host头匹配问题
问题描述
私有网络内部署了Nexus镜像仓库,通过Tailscale将K8s中的Nexus服务暴露至Tailnet,生成域名<servicenamene>.tailxxxxx.ts.net,但Nexus本身配置的监听域名是example.com。在GitHub Action中已完成Tailscale登录、代码拉取及Docker登录配置,执行docker-compose build时,Dockerfile内已将npm指向Tailnet的Nexus地址,但Nexus会拒绝Host头与nexusHttpHost不匹配的请求,求解决办法。
相关配置
GitHub Action 步骤
steps: - name: Tailscale uses: tailscale/github-action@v2 with: oauth-client-id: ${{ secrets.TS_OAUTH_CLIENT_ID }} oauth-secret: ${{ secrets.TS_OAUTH_SECRET }} tags: "tag:k8s" version: 1.56.0 - uses: actions/checkout@v2 - run: docker login -u xxx -p ${{ secrets.DOCKER_PASSWORD }} xxx.xxx.io - run: | .... docker-compose build ...
Dockerfile 配置
### FROM node:$NODE_VERSION as builder ARG NEXUS_NPM_TOKEN ARG NEXUS_CERT_FILE RUN npm config set //<servicenamene>.tailxxxxx.ts.net:8080/repository/npm-xxx/:_authToken $NEXUS_NPM_TOKEN \ && npm config set @psa:registry http://<servicenamene>.tailxxxxx.ts.net:8080/repository/npm-xxx/ ###
解决方案
方法1:修改Nexus的Host头允许配置
直接调整Nexus的配置,让它接受Tailnet域名的Host头:
- 找到Nexus安装目录下的
etc/nexus.properties文件 - 确保
nexus-args配置项包含nexus-http-host.xml - 编辑
nexus-http-host.xml,将<servicenamene>.tailxxxxx.ts.net加入允许的Host头列表;若安全要求不高,也可直接设置nexusHttpHost=0.0.0.0,允许任意Host访问 - 重启Nexus服务使配置生效
方法2:在Docker构建容器内做Host映射
方式A:修改容器hosts文件
在Dockerfile中先将example.com映射到Tailnet域名的IP,这样npm用example.com请求时就能正确打到Nexus:
# 解析Tailnet域名并将example.com映射到对应IP,写入hosts RUN getent hosts <servicenamene>.tailxxxxx.ts.net | awk '{print $1 " example.com"}' >> /etc/hosts # 更新npm配置为example.com地址 RUN npm config set //example.com:8080/repository/npm-xxx/:_authToken $NEXUS_NPM_TOKEN \ && npm config set @psa:registry http://example.com:8080/repository/npm-xxx/
方式B:npm请求强制指定Host头
如果你的npm版本支持该参数,在执行npm install时加上--host-header=example.com,直接把请求的Host头改成Nexus监听的域名:
RUN npm install --host-header=example.com
方法3:通过Tailscale添加DNS别名
在Tailscale管理控制台给Nexus的Tailnet域名添加example.com别名,让Tailnet内访问example.com时解析到Nexus节点:
- 登录Tailscale控制台,找到Nexus对应的服务节点
- 添加自定义DNS记录,将
example.com指向该节点的Tailnet IP - 修改Dockerfile中的npm配置,将registry地址改为
http://example.com:8080/repository/npm-xxx/,这样请求的Host头就与Nexus的nexusHttpHost匹配了
内容的提问来源于stack exchange,提问作者hungran
相关产品推荐
相关产品推荐

