一般來說要製作 Docker Image 只要透過每次執行 docker run
的結果,進行標記成 Image 就可以了。但是設定環境的步驟一般都不會是兩三個步驟這麼簡單,而且之後要製作新的 Docker Image 還需要一直重新執行也是非常麻煩的。
因此,使用 Dockerfile
來製作 Docker Image 就會變得非常容易,因為可以透過類似 Puppet 或者 Chef 的方式來設定自動化的環境安裝設定,之後只要等待環境配置完成就好。
Docker 是使用 Linux 的 Container 所設計而成,也就是在 Host 上利用一些技術將作業系統隔離出來。也因此,基本上只能運行 Linux (相容的)作業系統。
基於這些原因,我們製作自己的 Docker Image 就會需要一個基底,一個可以運行最基本作業系統讓我們可以不用從安裝作業系統開始。
FROM ruby:2.3
在 Dockerfile
中寫下 FROM
關鍵字,就可以指定這個 Docker Image 要基於哪個 Docker Image 來當作基底執行。
為了要自動化的配置環境,我們會需要可以執行一些指令,此時就可以使用 RUN
這個動作。
RUN apt-get install nodejs
以 Dockerfile
的設計,一個 RUN
關鍵字,或者其他像是 FROM
都會像 Git 一樣是一個 Commit (唯一記錄)所以有時候我們會合併好幾個指令一起執行。
RUN apt-get install nodejs && \
npm install
在不同應用情境下,會有不同的選擇。像是以功能性為主的 Docker Image 我們會分開多個 RUN
設定,來減少單一指令重複運行的時間(已經運行過的指令會自動沿用記錄)
不過如果希望包出來的 Docker Image 是適合架設服務用的話,就會採取合併指令的方式,來減少產出的 Docker Image 大小。
雖然撰寫 Dockerfile
已經加快不少配置的速度,但是更新環境時需要手動修改目錄或者版本的時候會有些許的不方便,所以一般來說會配置好環境變數方便更新。
ENV RUBY_VERSION 2.3.1
另一方便,像是這樣設定 RUBY_VERSION
等環境資訊,也可以讓之後使用這個 Docker Image 的人容易了解到目前的環境狀況,而能更好針對環境做偵測和調整運行的程式。
有時候配置環境需要有一些設定檔,但是在自動處理的時候我們不太可能直接將設定寫在 Dockerfile
裡面。
ADD LOCAL_PATH CONTAINER_PATH
像是我們要客製化 Concourse 的資源時,也會需要將我們寫的 check
in
opt
的檔案放到裡面。
ENV APP_SRC /usr/src/app
ADD example.rb $APP_SRC/example.rb
另一方面大部分的 Dockerfile
設定都可以結合環境變數使用,利用這樣的技巧可以快速的調整專案的路徑。
像是啟動伺服器之類的情況,我們都會希望可以在開始後自動執行,而不需要用 -it
進入後手動開啟伺服器。因此一般都會指定預設的執行指令,然後將伺服器啟動。
CMD ["/usr/sbin/nginx"]
像是這樣的方式指定預設的服務。
基本上透過上述幾個基本技巧,就可以製作出屬於我們的 Concourse 資源。如果還有興趣的話,可以到 Docker 官網的文件瞭解更多像是 ENTRYPOINT
等設定項。
下一篇會開始進行實作自訂資源類型。