示例网站 使用的 教程仓库,对仓库代码进行了部分自定义修改

docker.ts

import HTML from './docker.html';

export default {
  async fetch(request: Request): Promise<Response> {
    const url = new URL(request.url);
    const path = url.pathname;
    const originalHost = request.headers.get("host");
    const registryHost = "registry-1.docker.io";

    if (path.startsWith("/v2/")) {
      const headers = new Headers(request.headers);
      headers.set("host", registryHost);

      const registryUrl = `https://${registryHost}${path}`;
      const registryRequest = new Request(registryUrl, {
        method: request.method,
        headers: headers,
        body: request.body,
        redirect: "follow", // 按照教程修改了这一行
      });

      const registryResponse = await fetch(registryRequest);

      const responseHeaders = new Headers(registryResponse.headers);
      responseHeaders.set("access-control-allow-origin", originalHost as string);
      responseHeaders.set("access-control-allow-headers", "Authorization");
      return new Response(registryResponse.body, {
        status: registryResponse.status,
        statusText: registryResponse.statusText,
        headers: responseHeaders,
      });
    } else {
      return new Response(HTML.replace(/{{host}}/g, originalHost as string), {
        status: 200,
        headers: {
          "content-type": "text/html"
        }
      });
    }
  }
}

如何部署

# 使用wrangler
wrangler publish --config wrangler-dockerhub.toml

如何自定义域名

访问CloudFlare后台 -> Workers和Pages -> 进入需要自定义的Worker -> 设置 -> 触发器 -> 自定义域

image-20240620140432250

🍺转载文章请注明出处,谢谢!🍺