金融做網(wǎng)站百度瀏覽器網(wǎng)頁
文章目錄
- 前言
- 編寫規(guī)則
- 指令詳解
- FROM:基礎(chǔ)鏡像
- LABEL:鏡像描述信息
- MAINTAINER:添加作者信息
- COPY:從宿主機復(fù)制文件到鏡像中
- ADD:從宿主機復(fù)制文件到鏡像中
- WORKDIR:設(shè)置工作目錄
前言
Dockerfile是編寫docker鏡像必備的技能,那么鏡像是如何構(gòu)建?鏡像分層,這個層怎么分的,就是由Dockerfile中的每一條指令構(gòu)成
官方文檔直達:Dockerfile
構(gòu)建命令:
通過docker build -t repository:tag ./
即可構(gòu)建,要求:./下存在Dockerfile文件
編寫規(guī)則
- 文件名必須是
Dockerfile
- Dockerfile中所用的所有文件一定要和Dockerfile文件在同一級父目錄下
- Dockerfile中相對路徑默認都是Dockerfile所在的目錄
- Dockerfile中
能寫到一行的指令,一定要寫到一行
,因為每條指令都被視為一層,層多了執(zhí)行效率就慢- Dockerfile中
指令大小寫不敏感,但指令都用大寫(約定俗成)
- Dockerfile 非注釋行第一行必須是 FROM
- Dockerfile 工作空間目錄下支持隱藏文件(.dockeringore),類似于git的.gitingore
指令詳解
FROM:基礎(chǔ)鏡像
FROM <image>:<tag> [as other_name] # tag可選;不寫默認是latest版
FROM
是Dockerfile文件開篇第一個非注釋行代碼- 用于為鏡像文件構(gòu)建過程指定基礎(chǔ)鏡像,后續(xù)的指令都基于該基礎(chǔ)鏡像環(huán)境運行
- 基礎(chǔ)鏡像可以是任何一個鏡像文件
as other_name
是可選的,通常用于多階段構(gòu)建(有利于減少鏡像大小)- 使用是通過
--from other_name
使用,例如COPY --from other_name
LABEL:鏡像描述信息
LABEL author="zp wang <test@qq.com>"
LABEL describe="test image"# 或
LABEL author="zp wang <test@qq.com>" describe="test image"# 或
LABEL author="zp wang <test@qq.com>" \describe="test image"
- LABEL指令用來給鏡像以鍵值對的形式添加一些元數(shù)據(jù)信息
- 可以替代MAINTAINER指令
- 會集成基礎(chǔ)鏡像中的LABEL,key相同會被覆蓋
MAINTAINER:添加作者信息
MAINTAINER zp wang <test@163.com>
- 慢慢廢棄
COPY:從宿主機復(fù)制文件到鏡像中
COPY <src> <dest>
COPY ["<src>", "<src>", ... "<dest>"]
<src>
:要復(fù)制的源文件或目錄,支持通配符<src>
必須在build所在路徑或子路徑下,不能是其父目錄<src>
是目錄。其內(nèi)部的文件和子目錄都會遞歸復(fù)制,但<src>
目錄本身不會被復(fù)制- 如果指定了多個
<src>
或使用了通配符,這<dest>
必須是一個目錄,且必須以/
結(jié)尾
<dest>
:目標路徑,即鏡像中文件系統(tǒng)的路徑<dest>
如果不存在會自動創(chuàng)建,包含其父目錄路徑也會被創(chuàng)建
# 拷貝一個文件
COPY testFile /opt/
# 拷貝一個目錄
COPY testDir /opt/testDir
- testDir下所有文件和目錄都會被遞歸復(fù)制
- 目標路徑要寫testDir,否則會復(fù)制到/opt下
ADD:從宿主機復(fù)制文件到鏡像中
類似于
COPY
指令,但ADD
支持tar
文件和URL
路徑
ADD <src> <dest>ADD ["<src>","<src>"... "<dest>"]
<src>
如果是一個壓縮文件(tar
),被解壓為一個目錄,如果是通過URL
下載一個文件不會被解壓<src>
如果是多個,或使用了通配符,則<dest>
必須是以/
結(jié)尾的目錄,否則<src>
會被作為一個普通文件,<src>
的內(nèi)容將被寫入到<dest>
ADD hom* /mydir/ # 添加所有以"hom"開頭的文件
ADD hom?.txt /mydir/ # ? 替代一個單字符,例如:"home.txt"
ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/
ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/
操作準則同COPY指令的4點準則如果<src>為URL且<dest>不以/結(jié)尾,則<src>指定的文件將被下載并直接被創(chuàng)建為<dest>;
如果<dest>以/結(jié)尾,則文件名URL指定的文件將被直接下載,并保存為<dest>/<filename>,注意,URL不能是ftp格式的url
如果<src>是一個本地系統(tǒng)上的壓縮格式的tar文件,它將被展開為一個目錄,其行為類似于“tar -x”命令,然后,通過URL獲取到的tar文件將不會自動展開
如果<src>有多個,或其間接或直接使用了通配符,則<dest>必須是一個以/結(jié)尾的目錄路徑;
如果<dest>不以/結(jié)尾,則其被視作一個普通文件,<src>的內(nèi)容將被直接寫入到<dest>;
WORKDIR:設(shè)置工作目錄
- 類似于cd命令,為了改變當前的目錄域
- 此后RUN、CMD、ENTRYPOINT、COPY、ADD等命令都在此目錄下作為當前工作目錄
WORKDIR /opt
- 如果設(shè)置的目錄不存在會自動創(chuàng)建,包括他的父目錄
- 一個
Dockerfile
中WORKDIR
可以出現(xiàn)多次,其路徑也可以為相對路徑,相對路徑是基于前一個WORKDIR
路徑 WORKDIR
也可以調(diào)用ENV
指定的變量
WORKDIR <dirpath>在Dockerfile文件中, WORKDIR指令可出現(xiàn)多次,其路徑也可以為相對路徑,不過,其是相對此前一個 WORKDIR指令指定的路徑;另外, WORKDIR也可調(diào)用由 ENV指定定義的變量 .例如WORKDIR /var/log
WORKDIR $STATEPATH示例:WORKDIR /a (這時工作目錄為/a)WORKDIR b (這時工作目錄為/a/b)WORKDIR c (這時工作目錄為/a/b/c)
注:通過WORKDIR設(shè)置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執(zhí)行。在使用docker run 運行容器時,可以通過-w參數(shù)覆蓋構(gòu)建時所設(shè)置的工作目錄。