# dockloader
由于 [Docker Hub](https://hub.docker.com/) 及其镜像仓库在中国大陆地区被限制,您已无法在中国大陆地区通过 `docker pull` 来拉取映像。
虚拟化和容器技术已成为现代软件开发、开源和云计算的基石,我们完全无法想象在没有容器镜像的情况下,应用程序的构建、测试、发布和运行会如何进行。
对于普通个人用户,无论自己构建映像亦或是搭建 [Harbor](https://github.com/goharbor/harbor) 都会是一项耗时、耗力的投入与维护,也不是每个人都能轻松翻墙来拉取映像。
`dockloader` 项目的初衷是寻找一种无需任何部署即可简单替代 `docker pull` 从 docker.io 拉取映像的方案。它使用 [GitHub Actions](https://github.com/features/actions) 来从 `Docker Hub` 拉取映像并上传到 [GitHub Packages](https://github.com/features/packages) 之上,这样就可以通过 ghcr.io 来拉取映像。
这项工作并不复杂,当 `workflows` 被创建之后,仅需要提交一个 `PR` 即可触发,然后等待 `actions` 执行完毕即可通过 `docker pull ghcr.io/podboy/<image>[:tag]` 拉取对应的映像。
同时,基于 `Python(>=3.10)` 开发的 [dockloader](https://pypi.org/project/dockloader/) 命令行工具为迁移映像提供支撑。
## 拉取映像
请首先在 [Packages](https://github.com/orgs/podboy/packages) 中查找您需要的映像是否已经存在!
如果没有您需要的仓库或者特定版本,则可以提交[变更请求](#贡献指南)以更新映像。
## 贡献指南
由于 `Docker Hub` 的映像数量极其庞大,欢迎任何人贡献 `PR` 以帮助其他人获取到更多、更新、更好的映像。
提交 `PR` 之前,请先了解[贡献原则](#贡献原则)和[配置文件格式](#config-文件),并仔细阅读此贡献指南!
### 贡献原则
- 任何已添加的仓库新增 `tag` 只做格式审查
- 无条件的接受[官方映像](https://hub.docker.com/search?image_filter=official),只对 [library](cfgs/library) 中的新增内容做格式审查,无需提供任何额外的信息
- 增加非官方官方映像仓库,请首先考虑开源项目自己维护的官方仓库,如果没有官方仓库也请优先考虑有良好维护(定期更新并且有版本标签,而非仅有 `latest` 标签)并被广泛使用的仓库(有一定的拉取统计量),并请在配置文件的顶部增加项目链接,以供决策是否接受该仓库:
- `Docker Hub`链接
- 仓库(`Github`或者其他源码仓库)链接
- 主页链接(如果存在)
- 文档链接(如果存在)
- 其他(如:演示、预览页面)链接
### tag 格式
映像的 tag 的格式如下:
```text
[registry_host[:port]/][namespace/]repository[:<tag>|@sha256:<digest>]
```
`Docker Hub`的`registry`为固定的`docker.io`,`namespace`为`username`(官方映像为`library`)。
### config 文件
配置文件的总入口为 [docker.io](cfgs/docker.io) 文件,每个 `username` 均需要在 [cfgs](cfgs) 文件夹中新增一个同名的文件夹,并且在 [docker.io](cfgs/docker.io) 中增加一行 `import <username>` 以导入文件夹中的所有配置文件。
每个 `repository` 均需要新增一个同名的配置文件,并放置在对应的 `username` 文件夹(官方映像为 `library` 文件夹)下。
配置文件的格式为:
- 所有 "#" 之后的内容为注释内容
- 每行一个映像,并且将所有关联的 `tag` 合并在一起(示例:`mysql:8.0.0,8.0,8,latest`)
- 请按从上至下由新到旧的顺序,并且 `latest` 在第一行
### dockloader 命令行工具
如果你对 [dockloader](https://pypi.org/project/dockloader/) 命令行工具感兴趣,请向 [dockloader branch](https://github.com/podboy/dockloader/tree/dockloader) 提交 `PR`。
非常感谢您对本项目的支持和贡献!
Raw data
{
"_id": null,
"home_page": "https://github.com/podboy/dockloader/",
"name": "dockloader",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.10",
"maintainer_email": null,
"keywords": "docker, podman",
"author": "Mingzhe Zou",
"author_email": "zoumingzhe@outlook.com",
"download_url": "https://files.pythonhosted.org/packages/57/77/eddfaecce2d1a349ba4eb0838524d02aa09ae20bcba39e9747e3313a4c1e/dockloader-0.1.tar.gz",
"platform": "any",
"description": "# dockloader\n\n\u7531\u4e8e [Docker Hub](https://hub.docker.com/) \u53ca\u5176\u955c\u50cf\u4ed3\u5e93\u5728\u4e2d\u56fd\u5927\u9646\u5730\u533a\u88ab\u9650\u5236\uff0c\u60a8\u5df2\u65e0\u6cd5\u5728\u4e2d\u56fd\u5927\u9646\u5730\u533a\u901a\u8fc7 `docker pull` \u6765\u62c9\u53d6\u6620\u50cf\u3002\n\n\u865a\u62df\u5316\u548c\u5bb9\u5668\u6280\u672f\u5df2\u6210\u4e3a\u73b0\u4ee3\u8f6f\u4ef6\u5f00\u53d1\u3001\u5f00\u6e90\u548c\u4e91\u8ba1\u7b97\u7684\u57fa\u77f3\uff0c\u6211\u4eec\u5b8c\u5168\u65e0\u6cd5\u60f3\u8c61\u5728\u6ca1\u6709\u5bb9\u5668\u955c\u50cf\u7684\u60c5\u51b5\u4e0b\uff0c\u5e94\u7528\u7a0b\u5e8f\u7684\u6784\u5efa\u3001\u6d4b\u8bd5\u3001\u53d1\u5e03\u548c\u8fd0\u884c\u4f1a\u5982\u4f55\u8fdb\u884c\u3002\n\n\u5bf9\u4e8e\u666e\u901a\u4e2a\u4eba\u7528\u6237\uff0c\u65e0\u8bba\u81ea\u5df1\u6784\u5efa\u6620\u50cf\u4ea6\u6216\u662f\u642d\u5efa [Harbor](https://github.com/goharbor/harbor) \u90fd\u4f1a\u662f\u4e00\u9879\u8017\u65f6\u3001\u8017\u529b\u7684\u6295\u5165\u4e0e\u7ef4\u62a4\uff0c\u4e5f\u4e0d\u662f\u6bcf\u4e2a\u4eba\u90fd\u80fd\u8f7b\u677e\u7ffb\u5899\u6765\u62c9\u53d6\u6620\u50cf\u3002\n\n`dockloader` \u9879\u76ee\u7684\u521d\u8877\u662f\u5bfb\u627e\u4e00\u79cd\u65e0\u9700\u4efb\u4f55\u90e8\u7f72\u5373\u53ef\u7b80\u5355\u66ff\u4ee3 `docker pull` \u4ece docker.io \u62c9\u53d6\u6620\u50cf\u7684\u65b9\u6848\u3002\u5b83\u4f7f\u7528 [GitHub Actions](https://github.com/features/actions) \u6765\u4ece `Docker Hub` \u62c9\u53d6\u6620\u50cf\u5e76\u4e0a\u4f20\u5230 [GitHub Packages](https://github.com/features/packages) \u4e4b\u4e0a\uff0c\u8fd9\u6837\u5c31\u53ef\u4ee5\u901a\u8fc7 ghcr.io \u6765\u62c9\u53d6\u6620\u50cf\u3002\n\n\u8fd9\u9879\u5de5\u4f5c\u5e76\u4e0d\u590d\u6742\uff0c\u5f53 `workflows` \u88ab\u521b\u5efa\u4e4b\u540e\uff0c\u4ec5\u9700\u8981\u63d0\u4ea4\u4e00\u4e2a `PR` \u5373\u53ef\u89e6\u53d1\uff0c\u7136\u540e\u7b49\u5f85 `actions` \u6267\u884c\u5b8c\u6bd5\u5373\u53ef\u901a\u8fc7 `docker pull ghcr.io/podboy/<image>[:tag]` \u62c9\u53d6\u5bf9\u5e94\u7684\u6620\u50cf\u3002\n\n\u540c\u65f6\uff0c\u57fa\u4e8e `Python(>=3.10)` \u5f00\u53d1\u7684 [dockloader](https://pypi.org/project/dockloader/) \u547d\u4ee4\u884c\u5de5\u5177\u4e3a\u8fc1\u79fb\u6620\u50cf\u63d0\u4f9b\u652f\u6491\u3002\n\n## \u62c9\u53d6\u6620\u50cf\n\n\u8bf7\u9996\u5148\u5728 [Packages](https://github.com/orgs/podboy/packages) \u4e2d\u67e5\u627e\u60a8\u9700\u8981\u7684\u6620\u50cf\u662f\u5426\u5df2\u7ecf\u5b58\u5728\uff01\n\n\u5982\u679c\u6ca1\u6709\u60a8\u9700\u8981\u7684\u4ed3\u5e93\u6216\u8005\u7279\u5b9a\u7248\u672c\uff0c\u5219\u53ef\u4ee5\u63d0\u4ea4[\u53d8\u66f4\u8bf7\u6c42](#\u8d21\u732e\u6307\u5357)\u4ee5\u66f4\u65b0\u6620\u50cf\u3002\n\n## \u8d21\u732e\u6307\u5357\n\n\u7531\u4e8e `Docker Hub` \u7684\u6620\u50cf\u6570\u91cf\u6781\u5176\u5e9e\u5927\uff0c\u6b22\u8fce\u4efb\u4f55\u4eba\u8d21\u732e `PR` \u4ee5\u5e2e\u52a9\u5176\u4ed6\u4eba\u83b7\u53d6\u5230\u66f4\u591a\u3001\u66f4\u65b0\u3001\u66f4\u597d\u7684\u6620\u50cf\u3002\n\n\u63d0\u4ea4 `PR` \u4e4b\u524d\uff0c\u8bf7\u5148\u4e86\u89e3[\u8d21\u732e\u539f\u5219](#\u8d21\u732e\u539f\u5219)\u548c[\u914d\u7f6e\u6587\u4ef6\u683c\u5f0f](#config-\u6587\u4ef6)\uff0c\u5e76\u4ed4\u7ec6\u9605\u8bfb\u6b64\u8d21\u732e\u6307\u5357\uff01\n\n### \u8d21\u732e\u539f\u5219\n\n- \u4efb\u4f55\u5df2\u6dfb\u52a0\u7684\u4ed3\u5e93\u65b0\u589e `tag` \u53ea\u505a\u683c\u5f0f\u5ba1\u67e5\n- \u65e0\u6761\u4ef6\u7684\u63a5\u53d7[\u5b98\u65b9\u6620\u50cf](https://hub.docker.com/search?image_filter=official)\uff0c\u53ea\u5bf9 [library](cfgs/library) \u4e2d\u7684\u65b0\u589e\u5185\u5bb9\u505a\u683c\u5f0f\u5ba1\u67e5\uff0c\u65e0\u9700\u63d0\u4f9b\u4efb\u4f55\u989d\u5916\u7684\u4fe1\u606f\n- \u589e\u52a0\u975e\u5b98\u65b9\u5b98\u65b9\u6620\u50cf\u4ed3\u5e93\uff0c\u8bf7\u9996\u5148\u8003\u8651\u5f00\u6e90\u9879\u76ee\u81ea\u5df1\u7ef4\u62a4\u7684\u5b98\u65b9\u4ed3\u5e93\uff0c\u5982\u679c\u6ca1\u6709\u5b98\u65b9\u4ed3\u5e93\u4e5f\u8bf7\u4f18\u5148\u8003\u8651\u6709\u826f\u597d\u7ef4\u62a4\uff08\u5b9a\u671f\u66f4\u65b0\u5e76\u4e14\u6709\u7248\u672c\u6807\u7b7e\uff0c\u800c\u975e\u4ec5\u6709 `latest` \u6807\u7b7e\uff09\u5e76\u88ab\u5e7f\u6cdb\u4f7f\u7528\u7684\u4ed3\u5e93\uff08\u6709\u4e00\u5b9a\u7684\u62c9\u53d6\u7edf\u8ba1\u91cf\uff09\uff0c\u5e76\u8bf7\u5728\u914d\u7f6e\u6587\u4ef6\u7684\u9876\u90e8\u589e\u52a0\u9879\u76ee\u94fe\u63a5\uff0c\u4ee5\u4f9b\u51b3\u7b56\u662f\u5426\u63a5\u53d7\u8be5\u4ed3\u5e93\uff1a\n - `Docker Hub`\u94fe\u63a5\n - \u4ed3\u5e93\uff08`Github`\u6216\u8005\u5176\u4ed6\u6e90\u7801\u4ed3\u5e93\uff09\u94fe\u63a5\n - \u4e3b\u9875\u94fe\u63a5\uff08\u5982\u679c\u5b58\u5728\uff09\n - \u6587\u6863\u94fe\u63a5\uff08\u5982\u679c\u5b58\u5728\uff09\n - \u5176\u4ed6\uff08\u5982\uff1a\u6f14\u793a\u3001\u9884\u89c8\u9875\u9762\uff09\u94fe\u63a5\n\n### tag \u683c\u5f0f\n\n\u6620\u50cf\u7684 tag \u7684\u683c\u5f0f\u5982\u4e0b\uff1a\n\n```text\n[registry_host[:port]/][namespace/]repository[:<tag>|@sha256:<digest>]\n```\n\n`Docker Hub`\u7684`registry`\u4e3a\u56fa\u5b9a\u7684`docker.io`\uff0c`namespace`\u4e3a`username`\uff08\u5b98\u65b9\u6620\u50cf\u4e3a`library`\uff09\u3002\n\n### config \u6587\u4ef6\n\n\u914d\u7f6e\u6587\u4ef6\u7684\u603b\u5165\u53e3\u4e3a [docker.io](cfgs/docker.io) \u6587\u4ef6\uff0c\u6bcf\u4e2a `username` \u5747\u9700\u8981\u5728 [cfgs](cfgs) \u6587\u4ef6\u5939\u4e2d\u65b0\u589e\u4e00\u4e2a\u540c\u540d\u7684\u6587\u4ef6\u5939\uff0c\u5e76\u4e14\u5728 [docker.io](cfgs/docker.io) \u4e2d\u589e\u52a0\u4e00\u884c `import <username>` \u4ee5\u5bfc\u5165\u6587\u4ef6\u5939\u4e2d\u7684\u6240\u6709\u914d\u7f6e\u6587\u4ef6\u3002\n\n\u6bcf\u4e2a `repository` \u5747\u9700\u8981\u65b0\u589e\u4e00\u4e2a\u540c\u540d\u7684\u914d\u7f6e\u6587\u4ef6\uff0c\u5e76\u653e\u7f6e\u5728\u5bf9\u5e94\u7684 `username` \u6587\u4ef6\u5939\uff08\u5b98\u65b9\u6620\u50cf\u4e3a `library` \u6587\u4ef6\u5939\uff09\u4e0b\u3002\n\n\u914d\u7f6e\u6587\u4ef6\u7684\u683c\u5f0f\u4e3a\uff1a\n\n- \u6240\u6709 \"#\" \u4e4b\u540e\u7684\u5185\u5bb9\u4e3a\u6ce8\u91ca\u5185\u5bb9\n- \u6bcf\u884c\u4e00\u4e2a\u6620\u50cf\uff0c\u5e76\u4e14\u5c06\u6240\u6709\u5173\u8054\u7684 `tag` \u5408\u5e76\u5728\u4e00\u8d77\uff08\u793a\u4f8b\uff1a`mysql:8.0.0,8.0,8,latest`\uff09\n- \u8bf7\u6309\u4ece\u4e0a\u81f3\u4e0b\u7531\u65b0\u5230\u65e7\u7684\u987a\u5e8f\uff0c\u5e76\u4e14 `latest` \u5728\u7b2c\u4e00\u884c\n\n### dockloader \u547d\u4ee4\u884c\u5de5\u5177\n\n\u5982\u679c\u4f60\u5bf9 [dockloader](https://pypi.org/project/dockloader/) \u547d\u4ee4\u884c\u5de5\u5177\u611f\u5174\u8da3\uff0c\u8bf7\u5411 [dockloader branch](https://github.com/podboy/dockloader/tree/dockloader) \u63d0\u4ea4 `PR`\u3002\n\n\u975e\u5e38\u611f\u8c22\u60a8\u5bf9\u672c\u9879\u76ee\u7684\u652f\u6301\u548c\u8d21\u732e\uff01\n",
"bugtrack_url": null,
"license": "MIT",
"summary": "Docker Image Downloader.",
"version": "0.1",
"project_urls": {
"Bug Tracker": "https://github.com/podboy/dockloader/issues",
"Documentation": "https://github.com/podboy/dockloader/",
"Homepage": "https://github.com/podboy/dockloader/",
"Source Code": "https://github.com/podboy/dockloader/"
},
"split_keywords": [
"docker",
" podman"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "5173e7de63bf1170be60ecaab69bf65f36442a205c8aba9834b6f6bc0dc416d0",
"md5": "3e4a1a0be82e93851e165139698e9f81",
"sha256": "da2f5695d5815165fff453516c908397d6af8f72708cf89fadc0b3bad4084186"
},
"downloads": -1,
"filename": "dockloader-0.1-py2.py3-none-any.whl",
"has_sig": false,
"md5_digest": "3e4a1a0be82e93851e165139698e9f81",
"packagetype": "bdist_wheel",
"python_version": "py2.py3",
"requires_python": ">=3.10",
"size": 10809,
"upload_time": "2024-09-04T11:16:14",
"upload_time_iso_8601": "2024-09-04T11:16:14.152452Z",
"url": "https://files.pythonhosted.org/packages/51/73/e7de63bf1170be60ecaab69bf65f36442a205c8aba9834b6f6bc0dc416d0/dockloader-0.1-py2.py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "5777eddfaecce2d1a349ba4eb0838524d02aa09ae20bcba39e9747e3313a4c1e",
"md5": "f9b3eccb7898fd17023dfe98d91f6219",
"sha256": "91262e8c0989c528ba1b51b01772ba95375c623f2f2e64d9e413d7ce69e0c595"
},
"downloads": -1,
"filename": "dockloader-0.1.tar.gz",
"has_sig": false,
"md5_digest": "f9b3eccb7898fd17023dfe98d91f6219",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.10",
"size": 11691,
"upload_time": "2024-09-04T11:16:16",
"upload_time_iso_8601": "2024-09-04T11:16:16.278826Z",
"url": "https://files.pythonhosted.org/packages/57/77/eddfaecce2d1a349ba4eb0838524d02aa09ae20bcba39e9747e3313a4c1e/dockloader-0.1.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-09-04 11:16:16",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "podboy",
"github_project": "dockloader",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [],
"lcname": "dockloader"
}