WSの小屋

docker.io 被封了后如何下载国外镜像与使用

需要科学上网工具,在本地电脑上开启

docker pull —platform=linux/amd64 [镜像地址]拉取后

docker save -o xxx.tar [镜像名称]保存成 tar 文件

将该文件上传至服务器

再用docker load < xxx.tar将其导入

操作过于繁琐,所以笔者这里用 typescript 写了一个脚本来完成

typescript 复制代码
import { execSync } from "node:child_process";
import { NodeSSH } from "node-ssh";

const textDecoder = new TextDecoder();
const $ = (command: string) => textDecoder.decode(execSync(command));

const ssh = new NodeSSH();

await ssh.connect({
  host: process.env.SSH_HOST,
  username: process.env.SSH_USERNAME,
  password: process.env.SSH_PASSWORD,
});

const images = [
  // flannel相关
  // "docker.io/flannel/flannel:v0.25.6",
  // "docker.io/flannel/flannel-cni-plugin:v1.5.1-flannel2",

  // longhorn相关
  // "docker.io/longhornio/longhorn-manager:v1.7.1",
  // "docker.io/longhornio/longhorn-ui:v1.7.1",
  // "docker.io/longhornio/longhorn-share-manager:v1.7.1",

  // ingress-nginx相关
  // "registry.k8s.io/ingress-nginx/kube-webhook-certgen:v1.4.3",
  // "registry.k8s.io/ingress-nginx/opentelemetry-1.25.3:v20240813-b933310d",
  // "registry.k8s.io/ingress-nginx/controller:v1.11.2"

  "registry.k8s.io/pause:3.8",
];

for (const image of images) {
  const tarname = `${image.replace(/\//g, "-")}.tar`;

  // 拉取镜像
  console.log("docker pull", $(`docker pull --platform=linux/amd64 ${image}`));
  // 将镜像导出成tar文件
  console.log("docker save", $(`docker save -o ${tarname} ${image}`));
  // 上传文件至服务器
  console.log("putFile", await ssh.putFile(`${tarname}`, `${tarname}`));
  // 远程服务器导入该镜像
  console.log(
    "load",
    // containerd
    // await ssh.execCommand(`
    //   ctr -n k8s.io image import ${tarname}
    //   rm -f ${tarname}
    // `)
    // docker
    await ssh.execCommand(`
      docker load < ${tarname}
      rm -f ${tarname}
    `)
  );
}

ssh.dispose();

只需要在 images 中写入要同步的镜像地址,运行该脚本即可自动完成拉取、导出、上传与导入操作(需要本地安装 docker,运行脚本需要 node 环境)

源码在github

Comments | 1条评论

  • 头像
    wsvaio站长
    回复发布于 2024/11/15 06:09:04Safari 18.0.1 Mac OS 10.15.7 来自:

    1