Copyright

如果你的 Java/JVM 在容器化內運行,如 Docker 或 LXC,你也許已違反了 Oracle 的著作權授權協議。

原由出自「Running Java on Docker? You’re Breaking the Law」,爾後 InfoQ 有較完整報導「Does Running Java on Docker Containers Violate Agreements?」。

# 問題一:Oracle/Java 安裝前需要「執行」同意 Oracle/Java 的授權協議。

「執行」兩字是我刻意強調的重點,不是贅字。

Oracle/Java 在安裝前會顯示長篇的授權聲明,唯有使用者「接受 / Accept」後,才有合法的使用權。換句話說,如果繞過此步驟,即屬侵權。

原先正確的安裝方式有很多,包括手動至官方網站下載和 Debian / CentOS / Ubuntu 自帶套件安裝包,兩種方式的安裝過程都會顯示完整授權聲明,並讓使用者「執行」同意 / Accept 後,才會安裝。除非 Debian / CentOS / Ubuntu 等有另向 Oracle 取得授權。

所以這裡有兩個重點:知會 (權利義務) 及 同意。缺一不可。

但在容器化 / Docker 時代,為了方便建 Image,Dockerfile 幾乎都會內置 Cookie 以繞過應當「執行」的授權協議,例如 HennTakipi/Docker-Java.txt 為例的 Cookie: oraclelicense=accept-securebackup-cookie

而當散布此 Dockerfile 時,其他使用該 Dockerfile 的用戶會「自動」繞過授權而侵害 Oracle 的權益。也就是說,若你散布會害別人侵權,反之,若你使用他人之散布時,你則構成侵權。

不過契約授權以 Legal Entity 為單位,若 Dockerfile 非散布至另個 Entity,都是本人 / 本公司範圍內使用,以我對契約的認知,其實同一版本只要同意一次即可。

換句話說,本人只要在官方網站下載時,有合法同意該授權,則之後建立的 Dockerfile 都可以利用 “Cookie” 的方式繞過,達到「自動安裝」之目的。但重點是,若 Oracle/Java 更換版本時,還是建議「手動」再次同意。

# 問題二:Oracle/Java 為整體不可分割之授權。

摘錄 Oracle/Java 的授權全文 如下,

(i) you distribute the Redistributables complete and unmodified, and only bundled as part of Programs,

意指散布 Oracle/Java 時,必須是整體不可修改的。

但根據 HennTakipi/Docker-Java.txt 或是 Alpine Java Dockerfile 的作法,都有刪除原安裝檔的內容,如 rm -rf /opt/jdk 等程序。

這行為已明顯違反上述摘錄的條件,或已構成侵權之事實。

# 結論

➀ 若 Dockerfile 有包括上述指出的 “Cookie” 或 rm -rf /opt/jdk 等程序,請勿散布此 Dockerfile 供另 Legal Entity 使用。

➁ 若 Dockerfile 有包括上述指出的 “Cookie” 或 rm -rf /opt/jdk 等程序,只要你先行「手動」同意過一次,以後皆可在你的法定範圍內散布使用,例如部署到自己申請的雲服務。但建議若 Oracle/Java 使用版本不同時,流程需要重來一次。

➂ 無論如何,都不能異動原本 Oracle/Java 的安裝檔。雖然不再能使容器體積縮小,但未構成侵權。

➃ 使用其他的 Java/JVM,例如 OpenJDKZulu,因為授權態樣不同,所以無須遵行前述之行為。

最後,Oracle 有在官方 GitHub 發布公司認為合理的 Dockerfile 建置方式,Oracle / docker-images,明顯沒有 “Cookie” 及 rm -rf /otp/jdk 等程序,我認為有教育大眾如何遵循法律及警告大眾的意味。