上篇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)。
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"]
看起來很複雜嗎? 那我們就來分著看。
基本上可以看成三個部分:
- 基底系統
基本上就是執行的作業系統,常用的有像linux Ubuntu。
FROM ubuntu
2. 檔案複製
上面有提到,有些檔案比較適合另外放進去,例如我想放一些寫好的腳本程式進去,我就可以這樣寫。
WORKDIR /app
ADD . /app
這樣是指説 切換到/app
這個資料夾下,並且將本機相同資料夾下所有的檔案複製進/app
資料夾下。
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
參考文獻
- Dockerfile文件結構, jiajially
- Dockerfile reference, docker offical
- Docker RUN vs CMD vs ENTRYPOINT, Yury Pitsishin
1 thought on “Docker 入門到使用 – dockerfile”