Docker ------ Dockerfile初探
Docker-Dockerfile 初探
作者:elfin 資料來源:docker hub docker Docs
1、Dockerfile 前言
Dockerfile是映象、容器的靈魂,沒有它,額,你也可以生成映象,但是完全不懂dockerfile僅使用docker,感覺是沒有靈魂的!這樣容易在環境上受限制!
--------------------以上純屬個人胡扯,不代表官方意見-------------------
在Best practices for writing Dockerfiles裡面列舉了基本的命令的最佳配置。
在Dockerfile reference裡列舉了所有的命令及其例子,其中包括:
- Usage
- BuildKit
- Format
- Parser directives
- syntax
- escape
- Environment replacement
- .dockerignore file
- FROM
- RUN
- CMD
- LABEL
- MAINTAINER (deprecated)
- EXPOSE
- ENV
- ADD
- COPY
- ENTRYPOINT
- VOLUME
- USER
- WORKDIR
- ARG
- ONBUILD
- STOPSIGNAL
- HEALTHCHECK
- SHELL
2、ADD命令
ADD有兩種形式:
ADD [--chown=<user>:<group>] <src>... <dest>
ADD [--chown=<user>:<group>] ["<src>",... "<dest>"]
後一種形式對於包含空白的路徑是必需的。
注:--chown
只能在建立Linux containers使用,windows containers不支援!這裡使用者和組的所有權的概念不能在linux與windows間轉換,因此使用/etc/passwd和/etc/group將使用者和組名稱轉換為id限制了此功能僅適用於基於Linux作業系統的容器。
作用:
- ADD指令從
複製新檔案、目錄或遠端檔案url,並將它們新增到位於路徑 的映像檔案系統中。 - 可以指定多個
資源,但如果它們是檔案或目錄,則它們的路徑被解釋為相對於構建上下文的源。
# 新增所有以“hom”開頭的檔案
ADD hom* /mydir/
# 匹配“hom?.txt”形式的的檔案
ADD home.txt /mydir/
# 新增到WORKDIR的相對路徑
ADD test.txt relativeDir/
# 新增檔案到絕對路徑
ADD test.txt /absoluteDir/
# 新增包含特殊字元(如‘[’和‘]’)的檔案或目錄時,需要按照Golang(GO語言)規則對這些路徑進行轉義,以防止它們被視為匹配模式(參考正則,使用[]是有特殊意義的,這裡中括號可以是分隔符)
# 如果要新增arr[0].txt,需要使用如下的形式
ADD arr[[]0].txt /mydir/
重要知識點
所有新檔案和目錄都是用UID和GID為0(使用者ID、組ID為0,是root嘛?)建立的,除非可選--chown標誌指定了給定的使用者名稱、組名或UID/GID組合來請求新增內容的特定所有權。--chown標誌的格式允許username和groupname字串,也可以是任意組合的直接整數UID(使用者識別符號)和GID(使用者屬識別符號)。提供沒有groupname的使用者名稱或沒有GID的UID將使用與GID相同的數字UID。如果提供了使用者名稱或組名,容器的根檔案系統/etc/passwd和/etc/group檔案將分別用於執行從名稱到整數UID或GID的轉換。以下示例顯示--chown標誌的有效定義:
ADD --chown=55:mygroup files* /somedir/
ADD --chown=bin files* /somedir/
ADD --chown=1 files* /somedir/
ADD --chown=10:11 files* /somedir/
如果容器根檔案系統不包含/etc/passwd
或/etc/group檔案
,並且在--chown
標誌中使用了使用者名稱或組名(官方在建議你使用數字標識),則生成操作將失敗。使用數字標識不需要查詢,也不依賴於容器根檔案系統內容。
如果Last-Modified
頭,則該頭中的時間戳將用於設定目標檔案上的mtime
。但是,與ADD過程中處理的任何其他檔案一樣,mtime
不會包含在檔案是否已更改的確定中,並且應該更新快取。
ADD的其他規則
- 不可以使用
ADD ../something /something
新增其他目錄的檔案,因為使用docker build
首先會將當前資料夾及其子資料夾加入docker daemon。 - 如果
是一個URL,並且 沒有以斜槓結尾,則會從該URL下載一個檔案並將其複製到 。 - 如果
是一個URL, 以一個尾部斜槓結尾,則從URL推斷檔名並將檔案下載到 / 。例如,新增http://example.com/foobar/將建立檔案/foobar。URL必須有一個非平凡的路徑,以便在這種情況下可以發現適當的檔名(http://example.com將不工作)。 - 如果
是一個目錄,則複製目錄的全部內容(只複製資料夾內的資源,本身不復制),包括檔案系統元資料。 - 如果
是使用可識別的壓縮格式(identity、gzip、bzip2或xz)的本地tar歸檔檔案,則將其解壓為一個目錄。來自遠端URL的資源不會解壓縮。檔案衝突時,按照源樹的內容為準。(檔案是否被標識為可識別的壓縮格式完全取決於檔案的內容,而不是檔案的名稱。例如,如果一個空檔案碰巧以gz結尾,這將不會被識別為壓縮檔案,也不會生成任何型別的解壓縮錯誤訊息,而是將檔案簡單地複製到目標。) - 如果
是任何其他型別的檔案,則單獨複製它及其元資料。在這種情況下,如果 以一個斜槓/結尾,它將被視為一個目錄, 的內容將寫入 /base( )。 - 如果直接指定了多個
資源或由於使用萬用字元,則 必須是一個目錄,並且必須以斜槓/結尾。 - 如果
沒有以尾隨斜槓結尾,它將被視為常規檔案, 的內容將寫入 。 - 如果
不存在,則會連同路徑中所有丟失的目錄一起建立。
命令在官方文件都可以查到,就不花時間專門轉寫,這裡就遇到-持續更新……
完!