FROM centos:latest MAINTAINER "Steven Shi"<hi.steven@gmail.com> ADD openjdk-9.0.1_linux-x64_bin.tar.gz /usr/local RUN ln -s /usr/local/jdk-9.0.1 /usr/bin/java ENV JAVA_HOME /usr/bin/java ENV PATH $JAVA_HOME/bin:$PATH CMD java -version
docker build -t steven/java9 .
接下來說明一下 Dockerfile 中指令的用途:
- FROM centos:latest
每個鏡像需要有個"基礎鏡像",FROM 即指出要使用的基礎鏡像是 centos 的最新版本。
- MAINTAINER "Steven Shi"<hi.steven@gmail.com>
MAINTAINER 指令指出這個鏡像由誰創建和維護,後面的參數並沒有規定格式,姓名加上 email,這只是眾多用法中的一種。
- ADD openjdk-9.0.1_linux-x64_bin.tar.gz /usr/local
ADD 指令的第一個參數是要安裝的檔案的路徑,因為我將 openjdk-9.0.1_linux-x64_bin.tar.gz 和 Dockerfile 放在同一路徑,所以直接寫檔名即可,第二個參數是安裝進 container 的路徑。ADD 指令具有解壓縮的功能,另外一個類似的指令 COPY 就只能將檔案複製到指定的路徑。
- RUN ln -s /usr/local/jdk-9.0.1 /usr/bin/java
上一篇在解壓縮好 JDK 後,我們有建立一個連結以方便後續的存取,要在 container 中執行命令就用 RUN。如果有多個命令要執行,可以寫好幾個 RUN,但是,建議是在每個命令後加上反斜線 \,然後於次行寫下一個命令,這個方式製作出來的鏡像會比較小,因為每執行一次 RUN,docker 會產生一個鏡像層,多出一點體積。
- ENV JAVA_HOME /usr/bin/java
- ENV PATH $JAVA_HOME/bin:$PATH
上一篇手工製作時,我們沒有指定 JAVA_HOME 並設定 PATH,但是一般來說,Java 安裝好之後,這是必要的事。如果要設定環境變數,就用 ENV。
- CMD java -version
CMD 可以用來在 container 啟動後執行命令,要特別注意的是 CMD 只可以不寫或只寫一次! 這裡簡單的執行 java -version 以確定鏡像製作有成功。想要了解更多? 可以參考官網 https://docs.docker.com/engine/reference/builder/。
【補充】
製作好 image 可以試著把它推到 docker hub,首先當然要註冊一個帳號,我註冊的是 twleader,接著 create 一個 repository,我 create 一個命名為 java9 的 repository,接著如下:
- docker login
登入 docker hub,輸入帳號、密碼。
- docker tag f6cc7ec468a3 docker.io/twleader/java9
- docker push docker.io/twleader/java9
使用 tag 指令,為原本的 steven/java9 加上一個標籤,我命名 docker.io/twleader/java9 這樣才能 push 到 docker hub 的 twleader 帳號裡的 java9 repository,接著就是下 push 指令推到 docker hub 上。