Docker 入門指南——Dockerfile 指令

COPY 複製文件

格式:html

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

源路徑能夠是多個,甚至能夠使通配符,規則知足 Go 的 filepath.Math 規則。node

例如:python

COPY hom* /mydir/

目標路徑能夠使容器內的絕對路徑,也能夠是相對於工做目錄的相對路徑(工做目錄能夠使用 WORKDIR 指令指定)。目標目錄不存在會自動建立缺失目錄。git

能夠理解爲 COPY 源文件 目標文件,這裏的源文件一開始容易出錯,這個是你針對當前文件夾下路徑來講的,即便你寫的是/root/.pip/pip.conf,其實,它執行 build 時,會尋找的路徑是get-pip/root/.pip/pip.conf,你理解了嗎?github

COPY . /app
COPY ./.pip/pip.conf ~/.pip/pip.conf

和 COPY 做用相似的有一個叫 ADD 的命令,他倆有什麼區別呢?簡單來說, ADD 命令能夠實現,當你源文件是壓縮包時,它會自動解壓並複製到你指定的目標文件,並且,ADD 命令的源文件還能夠是一個 URL,但正是它功能的強大也給用戶帶來了不肯定性,因此 Docker 官方並不太推薦使用 ADD 這個命令。docker

參考shell

ADD 更高級的複製

ADD 指令和 COPY 指令相比,它的源路徑能夠是一個 URL,這種狀況,Docker 引擎會試圖去下載這個連接的文件放到目標路徑下。下載後的文件權限自動設置爲 600 。若是須要修改,加一層 RUN 命令進行權限調整。ubuntu

另外,若是下載的是壓縮包,也須要使用 RUN 指令進行解壓縮。因此,不弱直接使用 RUN 指令,而後使用 wget 或者 curl 工具下載進行操做。app

若是源路徑是一個 tar 壓縮文件,壓縮格式爲 gzipbzip2 以及 xz 狀況時, ADD 指令將自動解壓縮這個文件放到目錄路徑下。curl

例如:

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

Dockerfile 最佳實踐文檔中要求,儘量使用 COPY 指令,由於它的語義更明確。

ENTRYPOINT

當指定了 ENTRYPOINT 後,CMD 的含義就發生了改變,再也不是直接的運行其命令,而是將 CMD 的內容做爲參數傳給 ENTRYPOINT 指令,換句話說實際執行時,將變爲:

<ENTRYPOINT> "<CMD>"

CMD 命令會被 鏡像名以後的命令從新替換掉

參考

WORKDIR

用來切換工做目錄所用,若是目錄沒有,它還會自動給你建立這個目錄。要避免以下的使用方法,你會發現 app 目錄下根本就不會有 world.txt 內容:

RUN cd /app
RUN echo "hello" > world.txt

參考

.dockerignore

構建鏡像時,Docker須要先準備context ,將全部須要的文件收集到進程中。默認的context包含Dockerfile目錄中的全部文件,可是實際上,咱們並不須要.git目錄,node_modules目錄等內容。忽略一些不須要的文件,這樣能夠有效加快鏡像構建時間,同時減小Docker鏡像的大小。

.git/
node_modules

Reference

編寫 Dockerfile 實踐

dockerignore

相關文章
相關標籤/搜索