V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
codehz
V2EX  ›  程序员

一种另类离线下载的思路(免费)(同时适用于 GIT 仓库克隆)

  •  
  •   codehz ·
    CodeHz · 2017-04-15 13:23:43 +08:00 · 6352 次点击
    这是一个创建于 2565 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我们知道国内好多提供离线下载的站都已经炸掉了,而且现有能用的支持离线下载的网盘也是限制很大。。。

    百度云的限速就不提了。

    我们也知道国内 github 的 clone 是比较蛋疼的事情,即使挂了梯子,对于比较大的仓库,比如动辄几个 G 的 linux 内核, Chromium 之类的,也不一定能一次性 clone 完毕(然而 git 不支持断点续传)

    我最近想到了一个另类的方法,利用网络上现有的免费服务,为我们离线下载。。

    先看看回传的速度(我这网速 20 兆)

    这个速度还是可以接受的吧。。

    方法就是利用各种提供 Docker 构建的云的构建服务,直接把需要的文件的下载方式写在 Dockerfile 里,然后就是启动构建,构建完成后直接下载最顶层的镜像即可。。。对于 git clone 来说,要么写子模块,要么直接写 git clone 命令

    这个方法最大的优势就是免费,而且不违反任何能查阅到的 EULA/ToS ,而且,有些国内的构建平台有海外构建节点,用来 clone github 上的仓库是最适合不过的了。不过即使没有,我们还是可以直接使用 docker.io 的资源的:国内有一堆 docker 加速服务

    缺陷就是速度比较慢——因为文件要经过好多节点才能到达目的地,先是海外构建节点,然后是国内的 regisity ,最后才是你的电脑。。。

    至于如何下载 docker 的镜像,除了 docker pull 之外,还有很多选择——毕竟 docker 的协议是开放的,随便写一个客户端就可以获取到下载地址和 token...

    PS :用来搞 BT 下载的就算了,好多海外机房是禁止 BT 的,出现问题可能导致服务商服务中断,到时候势必会对其他用户产生影响,我们要的是合理利用,不要竭泽而渔。。。

    PPS :到时候我搞一个自动化工具来做这个。。

    第 1 条附言  ·  2017-04-15 22:48:01 +08:00

    好多人认为这个是滥用,我来统一解释一下吧。。。

    首先这里介绍的这个方法,并不是我先想到的,而且网络上大量存在类似使用方式,你不能说我写出来,就是我的错了。。。

    滥用,我的理解,就是超出使用范围——也就是说,首先得有一个范围,docker.io上的服务是明确规定有限制的:

    • 执行时间:2 小时
    • 内存:2 GB
    • CPU:1
    • 磁盘空间:30 GB

    除了这个硬性限制外,ToS还提到了有软限制

    多次违反软限制可能会被限制账户,这个也和使用者有关

    另外,ToS还规定了一些禁止的行为,比如P2P,违法内容,有版权内容一类的,这个就要看使用者具体下载什么了。

    因此,只要在这个范围内使用,我认为,都不能算是超出使用范围——你一定要是争论什么是正确的使用,什么是错误的使用,那就没意义了。

    Docker上有好多自动构建开发环境的项目,也是直接在Dockerfile里写RUN wget/RUN git clone的,要是你认为这个方法是滥用构建环境,那么,那些只不过是给这个行为再包装了一层而已,本质并无不同,如果认同这一点,你就会发现docker上已经没有什么合理使用自动构建的镜像了。

    合理和不合理在于用于下载的内容是否违法,而非下载行为本身!

    43 条回复    2020-08-12 13:53:26 +08:00
    zsj950618
        1
    zsj950618  
       2017-04-15 13:43:03 +08:00 via Android
    反正我可以说,如果被发现用 USTC 的 docker.io 代理做这个事情,我会直接封 ip
    codehz
        2
    codehz  
    OP
       2017-04-15 13:50:37 +08:00
    @zsj950618 直接走 docker.io 官方的也比 git clone 靠谱,至少可以断点续传。。所以即使国内全部禁用(使用的人多了,必然会这样),这个方法依旧是有效的。。。
    momocraft
        3
    momocraft  
       2017-04-15 14:05:55 +08:00
    真是不容易..
    reus
        4
    reus  
       2017-04-15 14:14:11 +08:00
    滥用就是违反 tos
    jccg90
        5
    jccg90  
       2017-04-15 14:16:14 +08:00
    感觉像是在滥用啊。。。玩烂了大家都不方便了。。。自己开个 vps 中转一下比较好吧,妥妥的满速。。。
    codehz
        6
    codehz  
    OP
       2017-04-15 14:42:16 +08:00
    @jccg90 这个思路绝对不是我第一个想出来的。。。 docker.io 上好多意义不明(拉取次数个位数,无执行语句,无任何有效软件安装,但是有很多明显不属于项目的大文件)的镜像。。说明这类用法已经玩烂了,只是没人明面说出来而已
    imn1
        7
    imn1  
       2017-04-15 14:55:10 +08:00
    看到最后都没提供一个带尾巴的免费 url ,差评
    codehz
        8
    codehz  
    OP
       2017-04-15 15:09:01 +08:00
    @imn1 我只是分享思路,不提供服务,按这个思路去做后果自负🙃
    loopio
        9
    loopio  
       2017-04-15 15:20:02 +08:00 via Android
    讲真,国内 git clone 速度感人。为了省事还是用 vps 。写个自动同步的脚本,再打包压缩放在网站目录下。用 http 下载速度都在 3M/s 以上。
    pagxir
        10
    pagxir  
       2017-04-15 16:39:09 +08:00 via Android
    没必要,因为我网络
    1 网速够快
    2 tcp 连接可以断点恢复,类似 quic 。
    3 再不济也可以利用国外的 vps 打包,然后 HTTP 下载。
    v1024
        11
    v1024  
       2017-04-15 17:38:56 +08:00 via iPhone   ❤️ 1
    怪不得那么多好服务都对国人敬而远之
    TJT
        12
    TJT  
       2017-04-15 17:41:12 +08:00
    git clone 不是可以用代理么, clone 的时候记得加上 --depth 1 就好,没有 checkout 旧版本的需求的话。
    codehz
        13
    codehz  
    OP
       2017-04-15 17:48:16 +08:00
    @TJT 用了代理,速度跑满然后中途挂掉了。。。。。一直都是--depth 1 ,但是对于这样规模的项目,该挂的还是挂。。。。。我们这网络一直都不太稳定,即使是国内的大文件下载,如果不支持断点续传,还是有几率会挂。。。。。
    t123yh
        14
    t123yh  
       2017-04-15 17:50:42 +08:00 via Android
    @codehz 开 kcptun ,可以避免。
    loading
        15
    loading  
       2017-04-15 17:59:32 +08:00 via Android   ❤️ 2
    这种事别人都是私底下做的,你写成教程就是罪人!
    phrack
        16
    phrack  
       2017-04-15 18:11:43 +08:00 via Android   ❤️ 3
    有些国人就是爱吸血,以吸死宿主吸肥自己为己任。

    那么多好服务用不了,也许真是不配,遭殃了那些看不懂套路的人。
    netfee
        17
    netfee  
       2017-04-15 18:32:39 +08:00 via Android
    不明觉厉。但是觉得楼主这么做不妥。网上“免费”的资源,也不该这么滥用。
    codehz
        18
    codehz  
    OP
       2017-04-15 18:41:08 +08:00   ❤️ 1
    @phrack 法无禁止则可为,在 Docker.io 的 ToS 中明确指出了使用 docker.io 的服务是有硬限制和软限制的,超出限制有权终止服务,本文提到的这种方法中并不存在任何试图绕过这些限制的方法,因此使用这个方法是否超出使用范围取决于使用者,你要是觉得这个不合理,你去修改 ToS 就好了
    相关 ToS 条款
    2.3 You agree not to (a) access (or attempt to access) the administrative interface of the Service by any means other than through the interface that is provided by Docker in connection with the Service, unless you have been specifically allowed to do so in a separate agreement with Docker, or (b) engage in any activity that interferes with or disrupts the Service (or the servers and networks which are connected to the Service).(是否会干扰 Docker.io 提供服务取决于下载内容有无违禁内容)
    3.3 You agree that you are responsible for your own conduct while accessing or using the Service and for any consequences thereof. You agree to use the Service only for purposes that are legal, proper and in accordance with these Terms and any applicable laws or regulations. By way of example, and not as a limitation, you may not and may not allow any third party to:(还是违法内容的相关条例,以及禁止 P2P 连接,取决于使用者)
    ryd994
        19
    ryd994  
       2017-04-15 21:48:20 +08:00 via Android
    @codehz You agree to use the Service only for purposes that are legal, proper
    这个真的叫 proper ?
    codehz
        20
    codehz  
    OP
       2017-04-15 22:19:29 +08:00   ❤️ 1
    @ryd994 你准备怎么定义恰当?还是贴完整一点的吧,上面只是顶部一小部分
    3.3 You agree that you are responsible for your own conduct while accessing or using the Service and for any consequences thereof. You agree to use the Service only for purposes that are legal, proper and in accordance with these Terms and any applicable laws or regulations. By way of example, and not as a limitation, you may not and may not allow any third party to:

    a. Send, upload, distribute or disseminate or offer to do the same with respect to any unlawful, defamatory, harassing, abusive, fraudulent, obscene, or otherwise objectionable content;传播违禁内容

    b. Distribute viruses, worms, defects, Trojan horses, corrupted files, hoaxes, or any other items of a destructive or deceptive nature;分发危害性内容

    c. Impersonate another person (via the use of an email address or otherwise) or otherwise misrepresent yourself or the source of any content;模仿他人或者伪造内容来源

    d. Upload, post, transmit or otherwise make available through the Service any content that infringes any patent, trademark, copyright, trade secret or other proprietary right of any party, unless you are the owner of such rights or have the permission of the owner to post such content;侵犯专利权

    e. Download any content posted by another user that you know, or reasonably should know, that cannot be legally distributed in such manner;下载不能合法分发的内容

    f. Submit content that falsely expresses or implies that such content is sponsored or endorsed by Docker;提交暗示由 docker 赞同的内容

    g. Use the Service to violate the legal rights (such as rights of privacy and publicity) of others;使用本服务侵犯他人权利

    h. Promote or encourage illegal activity;鼓励非法活动

    i. Interfere with other users' enjoyment of the Service;干扰其他用户

    j. Exploit the Service for any unauthorized commercial purpose;未经授权的商业利用

    k. Modify, adapt, translate, or reverse engineer any portion of the Service;修改或者逆向工程

    l. Remove any copyright, trademark or other proprietary rights notices contained in or on the Service or any content posted thereon;移除版权商标等按要求必须保留的内容

    m. Reformat or frame any portion of the web pages that are part of the Service's administration display;把服务管理页面重新格式化

    n. Use the Service in connection with illegal peer-to-peer file sharing;使用 P2P 文件分享服务

    o. Display any content on the Service that contains any hate-related or violent content or contains any other material, products or services that violate or encourage conduct that would violate any criminal laws, any other applicable laws, or any third party rights;显示任何暴力 /仇恨相关的内容

    p. Use any robot, spider, site search/retrieval application, or other device to retrieve or index any portion of the Service or the content posted thereon or to collect information about its users for any unauthorized purpose;使用爬虫

    q. Create user accounts by automated means or under false or fraudulent pretenses; or 自动化 /虚假方式创建用户

    r. Use the Service, or any interfaces provided with the Service, to access any Docker product or service in a manner that violates the Terms or other terms and conditions for use of such Docker product or service.使用本服务或者本服务提供的接口进行违反本条例或者其他 Docker 服务条款的行为

    在构建过程中下载其他合法资源,本来就是正常构建过程的一部分, docker 并没有限定镜像的除了违法用途以外的用途(它可没说镜像只能拿来运行,况且 docker 并没有提供运行环境),你一定要说它不恰当,那请给出“恰当”的定义,并且确保这个定义是广泛认可的
    Miy4mori
        21
    Miy4mori  
       2017-04-15 23:13:22 +08:00 via iPhone
    download zip 不可以?除了 release 中的源码,我记得整个仓库也可以 download zip 的
    codehz
        22
    codehz  
    OP
       2017-04-15 23:29:19 +08:00
    @Miy4mori 坑爹的是 download zip 也是不支持断点续传的——甚至连 HEAD 请求查询大小都不行。。。
    ryd994
        23
    ryd994  
       2017-04-15 23:32:46 +08:00 via Android
    @codehz 薅羊毛这么理直气壮也是少见
    Interfere with other users' enjoyment of the Service
    自己用用可能没啥,写成教程人多了以后,对其他人不是影响么?
    git clone 或者 wget 源码,那些都是为了 build ,而且一般是 shallow clone ,而且特别大的源码 build 完会删除
    ryd994
        24
    ryd994  
       2017-04-15 23:35:38 +08:00 via Android
    @codehz By way of example, and not as a limitation,
    你用例子里面没出现来说明你的行为合理,根本站不住脚
    proper 不 proper ,取决于 common sense 。语言的意义,本来就取决于大多数人的理解。你看看楼下多少说不妥,多少说妥,就知道怎么样是 proper 了
    linhua
        25
    linhua  
       2017-04-15 23:36:11 +08:00
    @codehz
    用代理 clone 时, 设置 iptables 丢弃 TCP RST 包,会不会好一点
    ryd994
        26
    ryd994  
       2017-04-15 23:38:22 +08:00 via Android   ❤️ 1
    git 可以先 shallow clone 再 unshallow ,只要有一层 clone 下来了,断掉的可以继续 fetch 补全
    codehz
        27
    codehz  
    OP
       2017-04-16 00:05:25 +08:00
    @ryd994 build 完删除并不代表不会占用存储空间—— docker 机制保证了每一个 RUN 命令都会创建一个独立的镜像, PULL 时,即使完全删除,也要拉取一遍
    利用 docker 的服务下载开发用到的源码,完全合理合法;用来下载电影,当然不合法,所以我发送的节点是程序员节点。。有些人就是逆向 XXXX :外国人这么用就合理的;中国人用就是不合适,不恰当的。
    你说我举得例子不恰当,那我就举几个具体的例子:
    runmymind/docker-android-sdk :内容就是自动下载一堆 android sdk ,大小 5.4G
    opengenomics/nci-downloader: 下载一个大文件,解压
    qlik/gradle: 直接下载 gradle 的包——并不能直接跑
    topfdrummer/minecraft: 直接下载 minecraft 服务端
    部分镜像的拉取量超过 10M+,如果有问题,官方早就处理了
    如果你认为下载过程不恰当,那么请问那些镜像是准备放着不拉取的吗?
    显然我觉得不恰当的地方恐怕是这个标题了——如果说用 docker 来搭建开发环境,估计就没这么多反对——然而,仔细想想,对于程序员而言,排除了违法内容后,这两者有什么区别吗?
    codehz
        28
    codehz  
    OP
       2017-04-16 00:09:26 +08:00
    @ryd994 看前面的楼层,我已经测试了--depth 1 的拉取,效果并不是很明显——我这里网络环境并不能一次性下载 500MB 以上的内容,无论有没有梯子都这样,可能采取一些奇怪的措施能够加强稳定性吧。--depth 1 仍然不能中断
    codehz
        29
    codehz  
    OP
       2017-04-16 00:41:09 +08:00   ❤️ 1
    @linhua 然而我是 windows 党😂, WSL 不支持 iptables ,另外其实 docker 也是不支持的,我是直接开放 api 导出下载地址的。为啥不双系统呢?原因是 windows 是目前 linux 最好的发行版。。。 wsl 编译安卓内核毫无压力,所以我就用了。。。

    另外我发现网络不稳定这个东西应该和丢包率有关系,我玩游戏的时候几乎没啥影响,因为流量不大,延迟也不高。然后下载的时候,流量大,持续时间长,这样就出现各种丢包,延迟;届时 PING baidu.com 都会有 50%以上的丢包率,而且当持续流量结束以后,并不是马上就能恢复的。。。检查应该不是路由器的问题(之前路由器出现过被高并发发包打死的情况,后来我买了个贵的就好了),因为直接连接网线我也试过了。。。这意味着单纯丢弃 RST 包并不会有啥效果。。。总感觉我这网络是被 QoS 什么的干掉了。
    amd00
        30
    amd00  
       2017-04-16 00:59:15 +08:00 via Android
    @codehz 如果大流量之后连百度都丢包成这样为何不去找你的运营商问题呢
    youling
        31
    youling  
       2017-04-16 02:22:52 +08:00
    感谢楼主分享!
    dongoo
        32
    dongoo  
       2017-04-16 02:26:57 +08:00
    说通过 docker 下载是滥用的?那请问用百度网盘离线下载的时候,算不算滥用网盘了?难道百度网盘理所当然给你下载了?

    虽然这种行为可能导致 docker 本身没得用,但是这个行为本身有什么问题?
    codehz
        33
    codehz  
    OP
       2017-04-16 02:37:47 +08:00 via Android
    @amd00 学校的网络,大家都这样。。。。别人用另一个运营商也是这个样子, QoS 应该是在学校那边的,跟学校反应半天也没个下文。。不过大多数地址都可以断点续传,所以一般也感觉不出来。。。而且流量不大的话,长连接也可以保持很久,大概这种情况很难得到有关领导的重视吧。。。。
    dongoo
        34
    dongoo  
       2017-04-16 02:40:56 +08:00
    另外到时 docker 公司完全也可以搞限速,搞会员来解决。

    说滥用的,只是自己没这样做,担心未来免费服务的常规使用也不能使用了而已,防止滥用这不是服务商自己应该解决的问题吗?大不了你倒闭呗。
    msg7086
        35
    msg7086  
       2017-04-16 04:27:46 +08:00   ❤️ 3
    让我想起了之前用 Github Issues 做回复插件的帖子了。

    作者问了 Github 能不能这么用。

    Github: 吼啊,资辞!

    V2 回帖者: 滚,这是滥用!喷死你丫的!
    FrankHB
        36
    FrankHB  
       2017-04-16 06:05:08 +08:00
    @ryd994 你的解释大概也不符合 common sense :无关人等解读 ToS 对当事人毫无卵用,不管是道德上还是法律上的。显然你无法就是否 proper 这个话题直接实现替代一般 users 进行价值判断,因为度量 proper 的因素不都是你能确定的,能纠结是否 proper 的绝大多数脑子长在别人脑袋里,你没法飞线过去确认或改变主张。当然,也可以强调事实判断来代替这个缺陷,比如当你确实就是这里所说的 user 之一的时候;不过,要是你当真主张取决于“大多数人的理解”,反而可能就不那么好办了。
    phrack
        37
    phrack  
       2017-04-16 12:19:03 +08:00 via Android
    讨论的挺热烈。

    docker 本身并没有禁止这个做法,国内提供加速的公司也没有禁止,如果是用来加速 github repo 的下载甚至是值得欣赏的一个小作品,技术本身没有任何问题。这个思路我以前也有过,但是因为 git 更好用,我存文件有时候就加密放到 github 或者国内的某些 git 服务商那里的。

    但是技术可能会被滥用,所以我前面讲某些吸血国人并不是针对你,如果 offend 到了你的感受,我表示抱歉。而是讲,如果你放出脚本,被人用来加速,比如,下载视频,进行非法文件共享,就会产生恶。这里其实应该是服务商的一个逻辑漏洞。

    通过漏洞进行无害利用,没什么,但是确实我们应该做的是上报漏洞,向服务商提出这种可能导致滥用的漏洞。

    实际上这种漏洞可能无法防范。比如微信照嫖的是违法的,当然也违反了微信的本意,这也是微信不能控制的逻辑漏洞。

    杀人不能诛心,我并没有看到 lz 并没有任何不良行为,所以我不会说你就是坏人。我前面气氛的是,你的脚本,一旦放出,很可能就会被利用到滥用,比如被人存小黄片然后分享,最后国内服务商不提供加速了,跟百度云一样来搞限速,搞审查。这样很多正常使用 docker 的人就会发现,为什么这么好的一项服务又要限速搞会员了。
    codehz
        38
    codehz  
    OP
       2017-04-16 12:47:34 +08:00
    @phrack 我本来打算放出的是获取镜像下载地址的工具,而非完全自动化的构造 Dockerfile 自动上传,自动触发构建什么的——获取镜像下载地址并非完全只有为了下载,也可以是在 Windows Subsystem for Linux 上获取特定镜像并运行( WSL 不支持完整 Linux 的各种 namespace , 因此不能运行 docker ,不过我测试大部分镜像都是可以在解压后加一个 chroot 就可以跑的,如果不考虑 overlay 文件系统和各种隔离的问题的话),但是听你这么一说,原本两个看似毫无关系的东西放在一起,就可以造成很大的影响了。。。所以我在考虑是否值得发布这个的工具。。。
    codehz
        39
    codehz  
    OP
       2017-04-16 12:50:12 +08:00
    利用工具获取到的链接并不能直接访问,而是需要携带特定的验证信息,对于一般用户而言,具有一定的使用门槛,从这个角度来说,下载地址被普通用户滥用的可能性还是比较低的。。。
    phrack
        40
    phrack  
       2017-04-16 13:15:19 +08:00 via Android
    @codehz 就像我前面说了,技术是没有错的,技术是没有主观意见的。如果被滥用,那是人的问题,这不是我们要不要开放源代码考虑的问题。

    很多开源项目都被滥用,比如 chroium ,被某几个公司,改一改就直接标为自己的知识产权,一点不提 chroium 的贡献。 chroium 总不能因为这个就闭源了。
    sammo
        41
    sammo  
       2017-04-16 14:25:33 +08:00
    滥用?

    if you truly have nothing better to do, think about why this so-called abuse only happen in China, not in other countries.

    what results in the poor connection to Github?

    无处安放的正义感



    -
    araraloren
        42
    araraloren  
       2017-04-17 08:52:58 +08:00
    ~~ git clone 不是能设置代理么,速度还可以
    touno
        43
    touno  
       2020-08-12 13:53:26 +08:00
    UP 主在这分享交流,你们却在指责?你们分享了什么?这是技术社区
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3302 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 14:06 · PVG 22:06 · LAX 07:06 · JFK 10:06
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.