{"id":19271572,"url":"https://github.com/eip-work/docker-image-loader","last_synced_at":"2025-04-21T21:33:31.004Z","repository":{"id":99181752,"uuid":"299778375","full_name":"eip-work/docker-image-loader","owner":"eip-work","description":null,"archived":false,"fork":false,"pushed_at":"2020-10-05T02:03:42.000Z","size":16,"stargazers_count":16,"open_issues_count":0,"forks_count":4,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-04-01T16:11:42.559Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Shell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/eip-work.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-09-30T01:25:28.000Z","updated_at":"2024-05-21T03:36:14.000Z","dependencies_parsed_at":null,"dependency_job_id":"6e70e88e-ccd7-4c2b-8136-7553860d8989","html_url":"https://github.com/eip-work/docker-image-loader","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eip-work%2Fdocker-image-loader","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eip-work%2Fdocker-image-loader/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eip-work%2Fdocker-image-loader/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eip-work%2Fdocker-image-loader/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eip-work","download_url":"https://codeload.github.com/eip-work/docker-image-loader/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":250136985,"owners_count":21380930,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-09T20:32:29.281Z","updated_at":"2025-04-21T21:33:30.996Z","avatar_url":"https://github.com/eip-work.png","language":"Shell","funding_links":[],"categories":[],"sub_categories":[],"readme":"# docker-image-loader\n\ndocker-image-loader 可以将一系列指定的 docker 镜像（外网环境）加载到一系列指定的目标（通常是内网环境）机器上。\n\n\u003e * docker-image-loader 被大量使用在 K8S 管理工具 [kuboard](https://kuboard.cn) 的内网安装场景下；\n\u003e * 可以完成类似任务的有 [sealos](https://github.com/fanux/sealos) 。（Sealos 是一款非常优秀的 Kubernetes 离线安装工具）。\n\ndocker-image-loader 项目假设您有一台机器 A 能够访问外网，有另外一台机器 B 能够访问所有的目标机器（通常是内网环境），且您有办法从机器 A 传输文件到机器 B 上（或者机器 A、机器 B 是同一台机器）。\n\n前提条件：\n* 机器 A 以及所有的目标机器都安装了 docker\n\ndocker-image-loader 工作过程：\n1. 在机器 A 上执行 `./pull.sh imagets-abc.txt` 以下载 `imagets-abc.txt` 文件中所指定的 docker image，镜像将被保存到 `imagets-abc.tar.gz` 文件中；\n2. 将 `./dispatch.sh` 文件和 `imagets-abc.tar.gz` 文件复制到机器 B；\n3. 在机器 B 上执行 `./dispatch.sh imagets-abc.tar.gz target-hosts.txt`，将前面步骤中下载到的镜像分发到 `target-hosts.txt` 文件中所定义的所有目标机器上。\n\n具体操作过程描述如下：\n\n## 准备工作\n\n### 下载 docker-image-loader\n\n* 在机器 A 上创建一个临时目录，并切换到该目录\n\n  ```sh\n  mkdir docker-image-loader\n  cd docker-image-loader\n  ```\n\n* 下载 docker-image-loader\n\n  ```sh\n  wget https://addons.kuboard.cn/downloads/docker-image-loader/dispatch.sh\n  wget https://addons.kuboard.cn/downloads/docker-image-loader/pull.sh\n  chmod +x dispatch.sh\n  chmod +x pull.sh\n  ```\n\n### 设置机器 B 可以无密码 ssh 访问所有目标机器\n\n  \u003e 如果您的机器 A 可以同时访问外网和内网，则 A 和 B 可以是同一台机器\n\n  在机器 B 上执行\n  \n* 生成 key 文件，如果您已经有 ssh key 文件，无需再次生成\n\n  ```sh\n  ssh-keygen -t rsa\n  ```\n\n* 设置无密码访问\n\n  ```sh\n  # 将 *\u003ctarget-host\u003e* 替换为目标主机的 IP 地址\n  # 针对每个目标主机都要执行一次，如此，机器 B 可以无密码 ssh 访问所有目标机器\n  ssh-copy-id -f -i ~/.ssh/id_rsa.pub root@*\u003ctarget-host\u003e*\n  ```\n\n## 在机器 A 上下载镜像\n\n\n* 创建 `imagets-abc.txt` 文件，内容如下所示：\n\n  文件中的每一行代表一个镜像（需包含 TAG）\n  \u003e * 文件名称可以自定义\n  \u003e * 文件内容请修改为您自己期望的任意数量的镜像\n  ```\n  quay.io/k8scsi/csi-provisioner:v1.6.0\n  quay.io/k8scsi/csi-resizer:v0.5.0\n  quay.io/k8scsi/csi-snapshotter:v2.1.1\n  quay.io/k8scsi/csi-attacher:v2.1.1\n  quay.io/cephcsi/cephcsi:v3.1.0\n  quay.io/k8scsi/csi-node-driver-registrar:v1.3.0\n  ```\n\n* 执行下载任务\n\n  ``` sh\n  ./pull.sh imagets-abc.txt\n  ```\n\n  镜像下载任务完成之后，会在同目录下生成一个压缩文件 `imagets-abc.tar.gz` （文件名称与 imagets-abc.txt 相同，后缀不同）\n\n\n## 将文件复制到机器 B\n\n用你自己的办法，将如下两个文件复制到机器 B 的某个目录，假设路径是 `~/docker-image-loader`：\n* `dispatch.sh`\n* `imagets-abc.tar.gz` （在前一个步骤中生成的文件）\n\n## 从机器 B 分发镜像到目标机器\n\n在机器 B 上执行：\n\n* 切换到 `~/docker-image-loader` 目录\n\n  ```sh\n  cd ~/docker-image-loader\n  ```\n\n* 创建 `target-hosts.txt` 文件，内容如下\n\n  ``` {1}\n  /root/.ssh/id_rsa\n  root@192.168.32.11:22\n  root@192.168.32.12:22\n  root@192.168.32.13:22\n  root@192.168.32.14:22\n  root@192.168.32.15:22\n  ```\n  * 第一行为 ssh key 文件的路径，我们在前面 **设置机器 B 可以无密码 ssh 访问所有目标机器** 的步骤中，已经将该 key 对应的 .pub 文件复制到所有的目标服务器上，后续将使用该 key 文件作为认证信息，远程在目标服务器上执行指令；\n    \u003e 此处 ssh key 文件的路径必须使用绝对路径\n  * 后面的每一行为一个目标机器的登录用户、IP 地址以及 ssh 端口（如果使用默认 22 端口，也需要在此处列出）。\n\n* 执行分发任务\n  ``` sh\n  chmod +x dispatch.sh\n  ./dispatch.sh imagets-abc.tar.gz target-hosts.txt\n  ```\n\n**至此，您已经成功地将指定的 docker image 分发到指定的目标机器上。**\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feip-work%2Fdocker-image-loader","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feip-work%2Fdocker-image-loader","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feip-work%2Fdocker-image-loader/lists"}