惊呆了!在 Docker 上运行 Java 程序?你已经触犯法律!
小伙伴们惊呆了!!!
来自国外媒体 takipi 的报道:在 Docker 容器中运行 Oracle Java 可能会让你承担法律责任,为什么呢?
Oracle 和 Linux 之间的关系跌宕起伏,为了在多数的 Linux 发行版使用 Oracle 的 JDK,用户都要经过一番折腾。而如果你使用 Docker ,那么问题更麻烦。因为你可能已经在未知的情况下违反了 Oracle 的许可协议。本文将为了解开其中详情以及帮你在使用 Docker 和 Java 时做出明智的决定。
首先 Java 在 Linux 是怎么开始成为一个问题的?
Oracle 的 Java 在多数 Linux 发行版中都不可用,这是因为 Oracle 关闭了“Operating System Distributor License for Java” (JDL) 协议。这意味着标准的软件仓库就不能使用 Java 和 Oracle Java。但用户可以选择自行下载并安装使用,这比直接从仓库中获取要麻烦得多。在 Oracle 的许可证协议中 C 段有这么一句话:
“Oracle grants you a non-exclusive, non-transferable, limited license without fees to reproduce and distribute the Software, provided that (i) you distribute the Software complete and unmodified and only bundled as part of, and for the sole purpose of running, your Programs…”
Oracle 的 JDK 是可以免费下载和使用,而且可免费用于商业用途。该协议的问题主要是针对于发行版。更深入的了解 JDK readme file 文档后,我们知道 Oracle 只允许分发未经修改过的 JRE 或者 JDK 版本,而且必须遵循要求去保留必须的文件。
这个要求导致多数的 Linux 发行版没法再其自己的渠道上重新分发 Oracle 的 Java 。Debian 用户可以下载 Oracle Java 的 tar 包,并使用 java-package 进行安装。CentOS 要求用户下载 rpm 包,这样用户可以在下载过程中手工的确认遵循 Oracle 的许可证。而红帽提供了如何添加一个 Oracle 维护的仓库的指示说明。
不速之客 —— OpenJDK
在我们之前的文章中,我们向你展示 如何通过 Alpine Linux 让 Docker 瘦身 7 倍 的文章,文章中使用了一个更小的 Java 映像。但我们在 Twitter 上收到的一个评论引起了我们的注意。这个评论来自于 Ben Evans ,这是 jClarity 的联合创始人,也是 infoQ 的 Java 编辑和 O\&\#39\;Reilly 媒体的作者。Ben 展示了 Oracle 许可证中注明的一些问题,以及使用 OpenJDK 构建 Java 的 Docker 映像。
@takipid @docker Your blogpost gives advice that expressly violates the license for Oracle Java & leaves your readers with legal liability — Ben Evans (@kittylyst) January 27, 2016
Ben 通过 Debian 和 Ubuntu OpenJDK 进一步的解释了这个问题:“因此这几乎不可能在源码树种提交这类的内容。”
Ben 补充说该二进制文件没有通过任何来自 Oracle 、红帽或者是 Azul 的 Java 兼容性和一致性的测试。
不允许重新分发?不能用 Docker!
No redistribution? No Docker
你会发现很容易就违反 Oracle 的许可证,特别是你在下载 Java 文件的时候。这是使用 Docker 后让问题变得更纠结。许可证中的限制部分直接影响了 Docker 映像对已编译的 Java 版本的使用。
简单的说,如果你下载一个 Dockerfile 包含了 Oracle 的 JDK,这就是协议所不允许的!映像文件没有包含来自 Oracle 要求必须的文件,或者是他们会插入一个代码可以自动同意 Oracle 的条款。而当你从官网上下载 Oracle JDK 时,你需要手工点击一个复选框来同意 Oracle 的条款。而一旦 Docker 映像使用了那个自动同意条款的代码,那么你就不会意识到有这个条款的存在。
所以这可能就是违法的,请勿在家里尝试!
如上面所说,这个代码包含两个主要的问题:
代码屏蔽了你需要手工同意条款的过程
移除了很多来自安装包中必须的元素(为了减小 Docker 映像的体积)
Oracle 的许可证非常不友好,不是吗?
怎么才能成为一个守法的 Java 用户?
你有两个选择:
我行我素。这意味着你不遵守 Oracle 许可证,旧习难改,哈哈
改用 OpenJDK,很多用户会选择这个开源产品,它的许可证友好得多
当选择第二种方式时,你可能会碰到一些 OpenJDK 映像无法被社区支持的问题,这些问题主要介于 Java 版本和官方尚未发行的之间。
如果你不确定如何开始,你可以选择红帽的 IcedTea,这是被自由软件基金会推荐的,或者使用 Azul System Zulu。
写在最后
现在你正面临很严峻的问题:该如何选择? 一些开发者会选择 OpenJDK 社区,因为可以根据自身需要进行修改它的任意元素来让他们的代码可以正常运行。但正如前面 Ben 提到的,使用 OpenJDK 可能会引发很多很奇怪的问题。
不管怎样,这是你自己的选择,我们都知道许可证条款无法阻止任何人使用一个特定的产品,也无法阻止你使用特定产品。我们只会将其中的问题向你详细的解释,让你知道在下一个项目中该如何做决策!
欢迎加入本站公开兴趣群
软件开发技术群
兴趣范围包括:Java,C/C++,Python,PHP,Ruby,shell等各种语言开发经验交流,各种框架使用,外包项目机会,学习、培训、跳槽等交流
QQ群:26931708
Hadoop源代码研究群
兴趣范围包括:Hadoop源代码解读,改进,优化,分布式系统场景定制,与Hadoop有关的各种开源项目,总之就是玩转Hadoop
QQ群:288410967