讓我們解釋一下上一篇的 Dockerfile 做了什麼事情。
第一行 FROM python:3.9.10-alpine3.15 宣告了我們要使用的基礎映像檔(Image),這可以視為我們的開發環境。通常,它會位於 Dockerfile 的頂部,並且一個 Dockerfile 通常只有一個 FROM 指令。這一行的意思是,我們要使用的基礎映像檔是基於 Alpine Linux 3.15,並且包含了 Python 3.9.10 環境。它們都屬於 Python 映像檔的分類。如果你是使用 Node.js 或其他開發環境,你可以在 DockerHub 上尋找相對應的映像檔。
接下來的第二行 WORKDIR /test-project 指定了工作目錄。如果不指定的話,預設工作目錄會是根目錄 /,並且會自動建立。我習慣在 Dockerfile 中建立一個專用的工作目錄,專門用來存放與專案相關的文件,這樣會更整潔。
第三行很簡單,COPY * . 的作用是將當前目錄下的所有文件複製到容器中。
第四行也很簡單,RUN pip install -r requirements.txt 用於安裝所有需要的 Python 套件。
第五行 EXPOSE 5000 宣告了容器內部開放的端口,但它只是宣告,不會自動將端口連接到主機。你需要在運行容器時進行端口映射,才能讓外部訪問。
第六行 CMD ["python", "app.py"] 則是指定容器啟動後要執行的命令。
或許你已經注意到第四行和第六行似乎有相同的功能,為什麼一個是 RUN 而另一個是 CMD 呢?
這是因為 RUN 是在建立 Docker 映像檔時運行的命令,而 CMD 則是在容器啟動時運行的命令。因此,通常會使用 RUN 來安裝和配置環境,而在容器啟動時使用 CMD 來指定應用程序的執行命令。
這樣,你已經學會了 Dockerfile 的基本用法。