格式: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
指令和 COPY
指令相比,它的源路徑能夠是一個 URL
,這種狀況,Docker 引擎會試圖去下載這個連接的文件放到目標路徑下。下載後的文件權限自動設置爲 600
。若是須要修改,加一層 RUN
命令進行權限調整。ubuntu
另外,若是下載的是壓縮包,也須要使用 RUN
指令進行解壓縮。因此,不弱直接使用 RUN
指令,而後使用 wget
或者 curl
工具下載進行操做。app
若是源路徑是一個 tar
壓縮文件,壓縮格式爲 gzip
,bzip2
以及 xz
狀況時, ADD
指令將自動解壓縮這個文件放到目錄路徑下。curl
例如:
ADD ubuntu-xenial-core-cloudimg-amd64-root.tar.gz /
Dockerfile 最佳實踐文檔中要求,儘量使用 COPY
指令,由於它的語義更明確。
當指定了 ENTRYPOINT
後,CMD
的含義就發生了改變,再也不是直接的運行其命令,而是將 CMD
的內容做爲參數傳給 ENTRYPOINT
指令,換句話說實際執行時,將變爲:
<ENTRYPOINT> "<CMD>"
CMD 命令會被 鏡像名以後的命令從新替換掉
參考
用來切換工做目錄所用,若是目錄沒有,它還會自動給你建立這個目錄。要避免以下的使用方法,你會發現 app
目錄下根本就不會有 world.txt
內容:
RUN cd /app RUN echo "hello" > world.txt
參考
構建鏡像時,Docker須要先準備context ,將全部須要的文件收集到進程中。默認的context包含Dockerfile目錄中的全部文件,可是實際上,咱們並不須要.git目錄,node_modules目錄等內容。忽略一些不須要的文件,這樣能夠有效加快鏡像構建時間,同時減小Docker鏡像的大小。
.git/ node_modules
編寫 Dockerfile 實踐
dockerignore