1. 程式人生 > 實用技巧 >Docker ------ Dockerfile初探

Docker ------ Dockerfile初探

Docker-Dockerfile 初探


作者:elfin  資料來源:docker hub  docker Docs

目錄


Bottom

1、Dockerfile 前言

​ Dockerfile是映象、容器的靈魂,沒有它,額,你也可以生成映象,但是完全不懂dockerfile僅使用docker,感覺是沒有靈魂的!這樣容易在環境上受限制!

--------------------以上純屬個人胡扯,不代表官方意見-------------------

Best practices for writing Dockerfiles裡面列舉了基本的命令的最佳配置。

Dockerfile reference裡列舉了所有的命令及其例子,其中包括:

Top - Bottom


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標誌中使用了使用者名稱或組名(官方在建議你使用數字標識),則生成操作將失敗。使用數字標識不需要查詢,也不依賴於容器根檔案系統內容。

如果是遠端檔案URL,則目標將擁有600的許可權。如果正在檢索的遠端檔案具有HTTP 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()。
  • 如果直接指定了多個資源或由於使用萬用字元,則必須是一個目錄,並且必須以斜槓/結尾。
  • 如果沒有以尾隨斜槓結尾,它將被視為常規檔案,的內容將寫入
  • 如果不存在,則會連同路徑中所有丟失的目錄一起建立。

Top - Bottom


命令在官方文件都可以查到,就不花時間專門轉寫,這裡就遇到-持續更新……

完!