Docker 入門到使用 – dockerfile

上篇Docker 入門到使用我們針對 container/image/Docker Hub這三項的關係進行說明,從這三項的關係中,似乎系統主要的建置、修改、打包、移植、分享,這些主要功能看似都已經完整達到了,然而卻有個不安的因素藏在這個關係之中。

其實實際做了一次就能發現這個問題,也就是

我們不確定別人分享的image實際包含什麼、做了什麼。

而且,若專案中有一些素材要求巨大容量,像是影片、圖片等等,這些東西會造成image肥大的因素也並不適合打包進image中。


透過 DockerFile來建置image

既然如此,有什麼更好的方法可以分享呢?

其實很簡單,也就是我們寫下建置步驟,並且分享這個建置步驟,當別人取得這個建置步驟後,就能在自己的docker中重建出相同的專案,而且也能從步驟中實際了解系統做了些事情。

很好的是,Docker本身就有提供這樣的工具,也就是Docker File,只要我們寫好一份Docker File,就能透過docker build .指令來建置image,因此我們可以跟別人直接分享這份Docker File或是包成一份image再傳上去dockerhub(並且在說明欄中貼上DockerFile也能讓別人更安心更方便地引用這個image)。
temp

 


DockerFile 結構

那一份基本的DockerFlie長什麼樣字呢?

這邊我找到一份基礎的DockerFlie

# This dockerfile uses the ubuntu image

# Base image to use, this must be set as the first line
FROM ubuntu

# Maintainer: docker_user <docker_user at email.com> (@docker_user)
MAINTAINER docker_user docker_user@email.com

#  
WORKDIR /app
ADD . /app

# Commands
ENV var="your_var"
RUN apt-get update \
  && apt-get install -y python3-pip python3-dev  
RUN pip3 install numpy
ENTRYPOINT [ "echo", "Hello dockerfile" ]
CMD ["/bin/bash"]

 

看起來很複雜嗎? 那我們就來分著看。

dockerfile

基本上可以看成三個部分:

  1.  基底系統

基本上就是執行的作業系統,常用的有像linux Ubuntu。

FROM ubuntu

 

2.  檔案複製

上面有提到,有些檔案比較適合另外放進去,例如我想放一些寫好的腳本程式進去,我就可以這樣寫。

WORKDIR /app
ADD . /app

這樣是指説 切換到/app這個資料夾下,並且將本機相同資料夾下所有的檔案複製進/app資料夾下。

temp

3.  其他指令

# Commands

ENV var="your_var"
RUN apt-get update \
  && apt-get install -y python3-pip python3-dev  
RUN pip3 install numpy
ENTRYPOINT [ "echo", "Hello dockerfile" ]
CMD ["/bin/bash"]

剩下就是其他指令部分,基本上常用的指令有4個,:

  • ENV 設定環境變數
  • RUN 執行指令
  • ENTRYPOINT 執行指令
  • CMD 執行指令

 

我們分開來說名這四個指令:

  • ENV

基本上 ENV並不難理解,範例如下:

ENV var="your_var"

 

但接下的三個就滿容易搞混的,用懶人包的方式說明的話,我建議可以這樣去理解這三個指令:

  • RUN 執行指令(安裝環境)
  • ENTRYPOINT 執行指令(邏輯指令)
  • CMD 執行指令(最後指令)

接下來我們看看範例對應:

  • RUN 執行指令(安裝環境)
RUN apt-get update \
  && apt-get install -y python3-pip python3-dev  
RUN pip3 install numpy

 

  • ENTRYPOINT 執行指令(邏輯指令)
ENTRYPOINT [ "echo", "Hello dockerfile" ]

 

  • CMD 執行指令(最後指令)
CMD ["/bin/bash"]

更詳細的差異我建議可以去了解 Docker RUN vs CMD vs ENTRYPOINT, Yury Pitsishin

 

 

 


參考文獻

  1. Dockerfile文件結構, jiajially
  2. Dockerfile reference, docker offical
  3. Docker RUN vs CMD vs ENTRYPOINT, Yury Pitsishin

One Comment

Add a Comment

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *