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

如何从NestJS应用连接Dockerhub Registry并实现仓库操作?

从NestJS连接Docker Hub Registry实现仓库管理

核心思路

Docker Hub提供官方REST API,我们可以基于这个API在NestJS中封装专属客户端,实现仓库创建、查询等操作——本质是通过带认证信息的HTTP请求与Docker Hub交互,和Google Artifact Registry、AWS ECR客户端的实现逻辑一致。

实现步骤

1. 生成Docker Hub认证令牌

Docker Hub API要求Bearer Token认证,首先通过用户名/密码获取令牌:

import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';

async function getDockerHubToken(httpService: HttpService, username: string, password: string): Promise<string> {
  const authBuffer = Buffer.from(`${username}:${password}`).toString('base64');
  const response = await firstValueFrom(
    httpService.post(
      'https://hub.docker.com/v2/users/login/',
      {},
      {
        headers: {
          Authorization: `Basic ${authBuffer}`,
        },
      }
    )
  );
  return response.data.token;
}

2. 封装NestJS客户端服务

创建DockerHubService统一处理API交互,注入HttpService完成请求:

import { Injectable, Inject } from '@nestjs/common';
import { HttpService } from '@nestjs/axios';
import { firstValueFrom } from 'rxjs';

@Injectable()
export class DockerHubService {
  private readonly registryUrl: string;
  private readonly username: string;
  private readonly password: string;
  private token: string;

  constructor(
    private readonly httpService: HttpService,
    @Inject('DOCKER_HUB_CONFIG') private config: { registryUrl: string; username: string; password: string }
  ) {
    this.registryUrl = config.registryUrl;
    this.username = config.username;
    this.password = config.password;
  }

  // 刷新过期令牌
  private async refreshToken(): Promise<void> {
    this.token = await getDockerHubToken(this.httpService, this.username, this.password);
  }

  // 创建新仓库(支持公开/私有)
  async createRepository(repoName: string, isPrivate: boolean = false): Promise<any> {
    if (!this.token) await this.refreshToken();
    
    try {
      const response = await firstValueFrom(
        this.httpService.post(
          `${this.registryUrl}/v2/repositories/${this.username}/`,
          {
            name: repoName,
            is_private: isPrivate,
          },
          {
            headers: {
              Authorization: `Bearer ${this.token}`,
              'Content-Type': 'application/json',
            },
          }
        )
      );
      return response.data;
    } catch (error) {
      // 令牌过期时自动重试
      if (error.response?.status === 401) {
        await this.refreshToken();
        return this.createRepository(repoName, isPrivate);
      }
      throw error;
    }
  }

  // 查询用户名下所有仓库
  async getRepositories(): Promise<any> {
    if (!this.token) await this.refreshToken();
    
    try {
      const response = await firstValueFrom(
        this.httpService.get(
          `${this.registryUrl}/v2/repositories/${this.username}/`,
          {
            headers: {
              Authorization: `Bearer ${this.token}`,
            },
          }
        )
      );
      return response.data;
    } catch (error) {
      if (error.response?.status === 401) {
        await this.refreshToken();
        return this.getRepositories();
      }
      throw error;
    }
  }
}

3. 配置模块并注入参数

在模块中注册服务,注入Docker Hub的配置信息:

import { Module } from '@nestjs/common';
import { HttpModule } from '@nestjs/axios';
import { DockerHubService } from './docker-hub.service';

@Module({
  imports: [HttpModule],
  providers: [
    DockerHubService,
    {
      provide: 'DOCKER_HUB_CONFIG',
      useValue: {
        registryUrl: 'https://hub.docker.com',
        username: '你的DockerHub用户名',
        password: '你的DockerHub密码/个人访问令牌',
      },
    },
  ],
  exports: [DockerHubService],
})
export class DockerHubModule {}

4. 实用注意事项

  • 优先使用Docker Hub的个人访问令牌代替密码,在账户设置的"Security"页面生成,权限更可控,泄露风险更低。
  • 令牌默认过期时间较短,服务中已实现自动刷新逻辑,可根据业务需求调整重试次数或缓存策略。
  • 可根据API文档扩展更多功能,比如删除仓库、查询镜像标签、配置Webhooks等。

参考资料说明

Docker Hub官方API文档包含所有可操作的端点、参数和响应格式,覆盖仓库管理、镜像操作、账户权限等全场景功能,所有接口细节都可以在官方提供的API参考中找到。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 02:10:33