在上一篇文章中,我們已經學習了基本的Dockerfile用法。現在,讓我們更深入地瞭解一些常用的Dockerfile指令,以及它們的用途。
關鍵字 | 描述 |
---|---|
FROM <image_name>[:<image_tag>] |
基礎映像。這指定了我們要使用的基礎映像檔,通常放在Dockerfile的頂部,用於設定開發環境。 |
COPY <src> <dest> |
複製文件或資料夾到容器內。規則需符合Go的filepath.Match。 |
ADD |
與COPY 相似,但在複製tar壓縮文件時會自動解壓縮。推薦使用COPY 除非有特殊需求。 |
RUN <command> or RUN [“command”, “arg1”, “arg2”, …] |
執行命令,用於在Dockerfile構建過程中執行操作。 |
CMD |
類似於RUN ,但在容器運行時執行,如果有多行CMD,只執行最後一行。 |
ENTRYPOINT |
類似於CMD ,但始終被執行。 |
WORKDIR <dir_name> |
設定工作目錄,建立的工作目錄會存在於每一層。如果不存在,則會自動建立。 |
EXPOSE <port_number> |
宣告開放的PORT,但需要使用端口映射來連接到主機。 |
ENV <key>=<value> |
設定環境變數,用於執行時所需的環境變數。 |
ARG |
類似於ENV ,但僅在Dockerfile作用,用於Image建構過程中的環境變數。 |
需要注意的是,Dockerfile的指令每執行一次都會在Docker上創建一個新的層(Layer),過多的無意義層會導致Image膨脹過大,最多到127層。
此外,Dockerfile撰寫規則要求必須包含至少1個CMD
或ENTRYPOINT
(但如果沒有好像也不會有什麼問題)。
現在,我們來更詳細地介紹這些指令的用途。
第一個FROM
已經在上一篇文章中介紹過了,它用於指定接下來的開發環境的基礎映像。
COPY
和ADD
都用於將文件或文件夾複製到容器內。不過,如果複製的文件是tar壓縮文件時,ADD
會自動解壓縮後再複製到容器內。根據官方文件,除非有特殊需求,推薦使用COPY
。
RUN
指令用於在Image建構的過程中執行特定操作,例如安裝套件或進行其他操作。
CMD
和ENTRYPOINT
都是在啟動容器時執行的指令,不同之處在於ENTRYPOINT
始終會被執行,而CMD
如果有多行,只會執行最後一行。當容器運行時,如果指定了其他指令,它們將覆蓋CMD
和ENTRYPOINT
。
WORKDIR
指令用於設定接下來的工作目錄。新建的工作目錄會存在於每一層,如果目錄不存在,它將自動創建。
EXPOSE
指令宣告容器內部開放的端口,但需要使用端口映射來連接到主機。
ENV
和ARG
用於設定環境變數。不同之處在於ARG
主要在Image建構過程中使用,用於指定版本等,而ENV
是在執行時所需的環境變數。