docker 运行java

将Oracle Java与Docker一起使用可能会使您承担法律责任。 为什么?

Oracle和Linux之间的关系起起落落。 主要发行版要求用户跳入更多圈以便使用Oracle的Java。 如果您使用的是Docker,则情况会更加严重,并且您可能甚至不了解Oracle的许可协议而违反了法律。 在这篇文章中,我们将帮助您了解整个情况,并就使用Java和Docker做出明智的决定。 让我们深入。

Java如何成为Linux上的问题?

由于Oracle淘汰了“ Java操作系统发行商许可证”(JDL),因此大多数Linux发行版都不提供Oracle Java。 这意味着标准软件存储库缺少内置Java和Oracle Java。 用户只需下载自己的Oracle JDK,而不必直接从存储库中获取它,则仍然可以使用Oracle的JDK。 但是,在阅读Oracle许可协议的C部分时,我们遇到了以下文本:

“ Oracle授予您一份非专有,不可转让的有限许可,不收取任何费用来复制和分发本软件,但前提是(i)您分发完整且未经修改的软件,并且仅作为其一部分捆绑销售,并且仅用于运行目的,您的程序……”

尽管Oracle JDK可免费下载并免费用于商业用途,但该协议在重新分发方面提出了一个问题。 对JDK自述文件的更深入研究表明,只要遵循保留所需文件的说明,您就只能分发未经修改的JRE和JDK版本。

此要求导致大多数Linux发行版不愿意在自己的渠道上重新分发Oracle Java。 Debian用户可以从Oracle手动下载Oracle Java tar并使用java-package进行安装,CentOS要求用户在java.com上下载Oracle提供的rpm,因此他们可以手动接受许可证, RedHat提供了有关如何添加Oracle维护的存储库的说明。

OpenJDK构建“神秘的肉”

在我们的最新一篇文章中,我们向您展示了如何使用Alpine Linux使用更小的Java映像来减轻Docker 7x的负担 。 我们在Twitter上收到了引起我们注意的评论。 该评论来自jClarity的联合创始人兼技术研究员Ben Evans,infoQ的Java编辑器以及O'Reilly Media的作者。 Ben阐明了Oracle的许可协议和流行Java Docker映像中使用的OpenJDK构建。

Ben进一步解释说,Debian或Ubuntu OpenJDK构建的问题在于它们与Java的任何已知版本都不对应。 “因此,几乎不可能知道Debian / Ubuntu二进制文件对应于源树上的哪些提交。”

Ben补充说,这些二进制文件尚未经过认证的Java二进制文件(来自Oracle,Red Hat或Azul)的任何兼容性和一致性测试。

“大多数开放源代码开发人员的时间非常稀缺,因此,我希望很少有OpenJDK开发人员会对跟踪或重现最终用户在其中一种“神秘的肉”版本上存在的错误感兴趣,因为报告的错误很可能在下一个发行版本之前已得到修复。”

没有Docker

您会发现Oracle的许可协议非常容易破解,尤其是当您从其他人那里下载Java文件时。 这就是Docker成为已经纠结的关系的另一部分的原因:协议中的重新分发部分对使用Java编译版本的Docker映像有直接影响。

简而言之,如果您下载的是包含Oracle JDK的Dockerfile,则您不会保留协议中的义务。 该映像可能不包含来自Oracle的必需文件,或者该映像的构建者可能插入了一个cookie,该cookie会自动为您批准Oracle的条款和条件。 从官方网站下载Oracle的JDK时,需要手动单击一个框以批准条款和条件。 通过添加cookie,用户不会意识到条款或批准条款的需要。

您即将看到的可能是非法的。 不要在家尝试:

# Download and unarchive Java
RUN mkdir /opt && curl -jksSLH "Cookie: oraclelicense=accept-securebackup-cookie"\
  http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz \
    | tar -xzf - -C /opt &&\
    ln -s /opt/jdk1.7.0_79 /opt/jdk &&\
    rm -rf /opt/jdk/*src.zip \
           /opt/jdk/lib/missioncontrol \
           /opt/jdk/lib/visualvm \
           /opt/jdk/lib/*javafx* \
           /opt/jdk/jre/lib/plugin.jar \
           /opt/jdk/jre/lib/ext/jfxrt.jar \
           /opt/jdk/jre/bin/javaws \
           /opt/jdk/jre/lib/javaws.jar \
           /opt/jdk/jre/lib/desktop \
           /opt/jdk/jre/plugin \
           /opt/jdk/jre/lib/deploy* \
           /opt/jdk/jre/lib/*javafx* \
           /opt/jdk/jre/lib/*jfx* \
           /opt/jdk/jre/lib/amd64/libdecora_sse.so \
           /opt/jdk/jre/lib/amd64/libprism_*.so \
           /opt/jdk/jre/lib/amd64/libfxplugins.so \
           /opt/jdk/jre/lib/amd64/libglass.so \
           /opt/jdk/jre/lib/amd64/libgstreamer-lite.so \
           /opt/jdk/jre/lib/amd64/libjavafx*.so \
           /opt/jdk/jre/lib/amd64/libjfx*.so \
    && addgroup -g 999 app && adduser -D  -G app -s /bin/false -u 999 app \
    && rm -rf /tmp/* \
    && rm -rf /var/cache/apk/* \
    && echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf

如上所述,此代码包含2个主要问题:

  • 替代您需要批准许可证的cookie。
  • 从安装包中删除几个元素(以最大程度地减少Docker映像的磁盘占用空间)

对Oracle许可证不是很友好,是吗?

您如何保持守法的Java用户?

您有2个选择:

  • 继续做任何事情。 这意味着您可能不遵循Oracle的许可证。 但是,到目前为止,它仍然对您有效,而且我们都知道旧的习惯会死掉,您可能不会开始从头开始重新编译所有内容。
  • 切换到OpenJDK。 许多用户已经在使用开源Java选项,您会很高兴地看到用户许可协议更加友好和基本:

“相比之下,GNU通用公共许可证旨在保证您共享和更改免费软件的自由-确保该软件对其所有用户都是免费的。”

在选择第二个选项时,您应考虑到社区不支持某些OpenJDK映像,并且它们可能包含尚未正式发布的Java版本。

如果您不确定从何处开始,则可能要选择Free Software Foundation推荐的RedHat IcedTea或Azul System Zulu。

最后的想法

现在,您面临一个棘手的问题:该做什么/选择什么? 一些开发人员会选择OpenJDK社区,这是由于能够修改,更改和添加他们需要的元素才能使代码正常工作。 但是正如Ben之前提到的那样,在使用OpenJDK时,您可能会发现自己试图在“神秘构建”上发现错误-这甚至不是您的错。

选择全由您决定。 我们都知道,协议条款永远不会阻止任何人使用某种产品,并且我们确信它现在不会阻止您。 我们只能列出事实和选项,因此您将知道在为下一个项目选择图像时要研究的内容。


docker 运行java