鏡像定制都會使用 Dockerfile 的一些指令特碳,比如 FROM全蝶、RUN、ADD、COPY等爱沟,其實利用Dockerfile定制鏡像所需要的指令會比較多捞烟,Dockerfile 功能非常強大嗽仪,可以提供很多的指令鳄哭。
COPY 復制文件
格式:
- COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
- COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
和 RUN 指令一樣,也有兩種格式萎胰,一種類似于命令行碾盟,一種類似于函數(shù)調用
COPY 指令將從構建上下文目錄中 <源路徑> 的文件/目錄復制到新的一層的鏡像內的 <目標路徑> 位置冰肴。如,
FROM nginx:latest
COPY hello.txt home/
COPY html/index.html /usr/share/nginx/
<源路徑> 可以是多個榔组,甚至可以是通配符,通配符要滿足 Go 的 filepath.Match
規(guī)則搓扯,如,
COPY hom* /mydir/
COPY hom?.txt /mydir/
<目標路徑> 可以是容器內的絕對路徑锨推,也可以是相對于工作目錄的相對路徑(工作目錄可以用 WORKDIR 指令來指定)。目標路徑不需要事先創(chuàng)建换可,如果目錄不存在會在復制文件前先行創(chuàng)建缺失目錄。
COPY 指令還會保留源文件的各種元數(shù)據(jù)沾鳄。比如讀、寫洞渔、執(zhí)行權限、文件變更時間等磁椒。這個特性對于鏡像定制很有用。特別是構建相關文件都在使用 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/
如果源路徑是文件夾医增,復制的時候不是直接復制該文件夾,而是將文件夾中的內容復制到目標路徑茫多。
構建過程
查看Dockerfile 所在目錄的結構
[root@ip-10-1-0-142 mynginx]# tree
.
├── app
│ ├── app.jar
│ ├── hello.txt
│ └── html
│ └── index.html
└── Dockerfile
2 directories, 4 files
[root@ip-10-1-0-142 mynginx]#
鏡像構建
[root@ip-10-1-0-142 mynginx]# docker build -f Dockerfile -t docker:v2 app
Sending build context to Docker daemon 3.631kB
Step 1/3 : FROM nginx:latest
---> 08b152afcfae
Step 2/3 : COPY hello.txt home/
---> Using cache
---> 7d8a97c733a6
Step 3/3 : COPY html/index.html /usr/share/nginx/
---> Using cache
---> dfa69cdc3b6d
Successfully built dfa69cdc3b6d
Successfully tagged docker:v2
[root@ip-10-1-0-142 mynginx]# ls
app Dockerfile
運行一個容器
[root@ip-10-1-0-142 mynginx]# docker run -itd --name docekr3 -p 82:80 docker:v2 bash
c3660ca7af4a53ea3d6f03a8bc3a795ba3c83a9e7f1b9bcdc3cfac646fdea20d