dockerhub.js 1.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /**
  2. * Docker Hub 代理路由
  3. */
  4. const express = require('express');
  5. const router = express.Router();
  6. const axios = require('axios');
  7. const logger = require('../logger');
  8. // Docker Hub API 基础 URL
  9. const DOCKER_HUB_API = 'https://hub.docker.com/v2';
  10. // 搜索镜像
  11. router.get('/search', async (req, res) => {
  12. try {
  13. const { term, page = 1, limit = 25 } = req.query;
  14. // 确保有搜索关键字
  15. if (!term) {
  16. return res.status(400).json({ error: '缺少搜索关键字(term)' });
  17. }
  18. logger.info(`搜索 Docker Hub: 关键字="${term}", 页码=${page}`);
  19. const response = await axios.get(`${DOCKER_HUB_API}/search/repositories`, {
  20. params: {
  21. query: term,
  22. page,
  23. page_size: limit
  24. },
  25. timeout: 10000
  26. });
  27. res.json(response.data);
  28. } catch (err) {
  29. logger.error('Docker Hub 搜索失败:', err.message);
  30. res.status(500).json({ error: 'Docker Hub 搜索失败', details: err.message });
  31. }
  32. });
  33. // 获取镜像标签
  34. router.get('/tags/:owner/:repo', async (req, res) => {
  35. try {
  36. const { owner, repo } = req.params;
  37. const { page = 1, limit = 25 } = req.query;
  38. logger.info(`获取镜像标签: ${owner}/${repo}, 页码=${page}`);
  39. const response = await axios.get(
  40. `${DOCKER_HUB_API}/repositories/${owner}/${repo}/tags`, {
  41. params: {
  42. page,
  43. page_size: limit
  44. },
  45. timeout: 10000
  46. });
  47. res.json(response.data);
  48. } catch (err) {
  49. logger.error('获取 Docker 镜像标签失败:', err.message);
  50. res.status(500).json({ error: '获取镜像标签失败', details: err.message });
  51. }
  52. });
  53. // 直接导出路由实例
  54. module.exports = router;