Oracle/Java 在容器化 (Containerization, 如 Docker) 時代的著作權侵權淺析
如果你的 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,例如 OpenJDK 或 Zulu,因為授權態樣不同,所以無須遵行前述之行為。
最後,Oracle 有在官方 GitHub 發布公司認為合理的 Dockerfile 建置方式,Oracle / docker-images,明顯沒有 “Cookie” 及 rm -rf /otp/jdk
等程序,我認為有教育大眾如何遵循法律及警告大眾的意味。