COPY 復制文件 & ADD 更高級的復制文件—— Dockerfile


COPY 復制文件

ADD 更高級的復制文件

 

格式:

  • COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
  • COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]

和 RUN 指令一樣,也有兩種格式,一種類似於命令行,一種類似於函數調用。

 

COPY 指令將從構建上下文目錄中 <源路徑> 的文件/目錄 復制到 新的一層的鏡像內的 <目標路徑> 位置。比如:

COPY package.json /usr/src/app/ 

<源路徑> 可以是多個,甚至可以是通配符,其通配符規則要滿足 Go 的 filepath.Match 規則,如:

COPY hom* /mydir/ COPY hom?.txt /mydir/ 

<目標路徑> 可以是容器內的絕對路徑,也可以是相對於工作目錄的相對路徑工作目錄可以用 WORKDIR 指令來指定)。目標路徑不需要事先創建,如果目錄不存在會在復制文件前先行創建缺失目錄。

 

此外,還需要注意一點,使用 COPY 指令,源文件的各種元數據都會保留

比如讀、寫、執行權限、文件變更時間等。這個特性對於鏡像定制很有用

特別是構建相關文件都在使用 Git 進行管理的時候。

 

在使用該指令的時候還可以加上 --chown=<user>:<group> 選項來改變文件的所屬用戶及所屬組

COPY --chown=55:mygroup files* /mydir/
COPY --chown=bin files* /mydir/
COPY --chown=1 files* /mydir/
COPY --chown=10:11 files* /mydir/

  

ADD 更高級的復制文件

ADD 指令和 COPY 的格式和性質基本一致。但是在 COPY 基礎上增加了一些功能

比如 <源路徑> 可以是一個 URL,這種情況下,Docker 引擎會試圖去下載這個鏈接的文件放到 <目標路徑> 去。下載后的文件權限自動設置為 600,如果這並不是想要的權限,那么還需要增加額外的一層 RUN 進行權限調整,另外,如果下載的是個壓縮包,需要解壓縮,也一樣還需要額外的一層 RUN 指令進行解壓縮

所以不如直接使用 RUN 指令,然后使用 wget 或者 curl 工具下載,處理權限、解壓縮、然后清理無用文件更合理。因此,這個功能其實並不實用,而且不推薦使用

 

如果 <源路徑> 為一個 tar 壓縮文件的話,壓縮格式為 gzipbzip2 以及 xz 的情況下,ADD 指令將會自動解壓縮這個壓縮文件到 <目標路徑> 去。

在某些情況下,這個自動解壓縮的功能非常有用,比如官方鏡像 ubuntu 中:

FROM scratch
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
...

但在某些情況下,如果我們真的是希望復制個壓縮文件進去,而不解壓縮,這時就不可以使用 ADD 命令了。

 

在 Docker 官方的 Dockerfile 最佳實踐文檔 中要求,盡可能的使用 COPY,因為 COPY 的語義很明確,就是復制文件而已,而 ADD 則包含了更復雜的功能,其行為也不一定很清晰

最適合使用 ADD 的場合,就是所提及的需要自動解壓縮的場合。  

 

另外需要注意的是,ADD 指令會令鏡像構建緩存失效,從而可能會令鏡像構建變得比較緩慢

因此在 COPY 和 ADD 指令中選擇的時候,可以遵循這樣的原則,所有的文件復制均使用 COPY 指令僅在需要自動解壓縮的場合使用 ADD

 

在使用該指令的時候還可以加上 --chown=<user>:<group> 選項來改變文件的所屬用戶及所屬組

ADD --chown=55:mygroup files* /mydir/
ADD --chown=bin files* /mydir/
ADD --chown=1 files* /mydir/
ADD --chown=10:11 files* /mydir/

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM