複習下鏡像生成途徑docker
Dockerfileshell
基於容器製做數組
什麼是dockerfile:tcp
用來構建鏡像的源碼,在配置文件中調用命令,這些命令是用來生成docker鏡像的。ui
dockerfile的語法格式:url
由兩類組成:命令行
#Comment 註釋信息對象
INSTRUCTION arguments 指令和指令參數 (指令大寫爲了區分參數和別的符號)遞歸
ps: 指令自己不區分大小寫,然而約定俗成要大寫進程
按順序依次執行
第一行必須使用 FROM 指定基於哪一個基礎鏡像來實現
所以:能夠推斷 全部要構建的鏡像都是創建在某個已存在的某個鏡像基礎之上
dockerfile工做邏輯
找一個專用的目錄放dockerfile文件,文件名首字母必須大寫,執行的時候不能有當前文件父目錄,必須基於當前目錄往下走,
工做目錄下也能夠 建立一個.dockerfile的文件,打包是不會包含此目錄下的文件。
執行方式:
docker build 執行
例如:docker build -t tinyhttpd:v1 ./
-t: 指構建後寫的名字
./ : 當前的dockerfile
製做鏡像時能使用的環境變量
賦值:變量名=值
引用:$變量名 或者 ${變量名}
${變量名:-word} 表示若是變量的值爲空或未設置,引用後面傳進來的值
${變量名:+word} 表示若是變量的值不爲空,則顯示後面的值
Dockerfile的指令:
FROM指定是最重要的一個且必須爲Dockerfile文件開篇的第一個非註釋行,用於爲映像文件構建過程指定基準鏡像,後續的指定運行於次準鏡像所提供的運行環境
實踐中,基準鏡像能夠是任何可用鏡像文件,默認狀況下,docker build會在docker主機上查找指定的鏡像文件,在其不存在時,則會從Docker hub registry上拉取所需的鏡像文件
若是找不到指定的鏡像文件,docker build會返回一個錯誤信息
語法:
FROM <repository>[:<tag>] 或 FROM <repository>@<digest>
<repository>:指定做爲base image的名稱
<tag>:base image的標籤,爲可選項,省略表示latest
MAINAINER (這是一個可選項)
用於讓Dockerfile製做人提供本人的詳細信息
不限制此指令出現的位置,推薦位於FROM以後
語法:
MAINTAINER <author's detail>
<author's detail>但是任何文本信息,但約定俗成使用做者名稱或郵箱
MAINTAINER "ivy" <ivy@163.com>
ps: 較新版本中已經把maintainer換成lable了,但依舊兼容
LABLE 讓用戶爲鏡像指定各類各樣的元數據
語法:
LABLE <key>=<value> <key>=<value> ...
COPY
用於從Docker主機複製文件到建立的映像文件系統中
語法:
COPY <src>...<dest> 或
COPY ["<src>",..."<dest>"]
<src>: 要複製的源文件目錄,支持使用通配符
<dest>:目標路徑,即正在建立的image的文件系統路徑,此處建議爲絕對路徑
ps:若是路徑中有空白字符時,一般使用第二種格式
文件複製準則:
<src>必須是build上下文中的路徑,不能是其父目錄中的文件
若是<src>是目錄,不用加=r選項則其內部文件或子目錄會被遞歸複製,但自身不會被複制
如之多多個<src>,或者<src>中使用通配符,則dest必須是一個目錄以/結尾
若是dest事先不存在,它將會被自動建立,包括其父目錄的路徑
總結:src必須使用相對路徑,dest使用絕對路徑
ADD
ADD指令相似於COPY指令,ADD支持使用TAR文件和URL路徑
語法:
ADD <src>...<dest> 或
ADD ["<src>",..."<dest>"]
操做準則:
同COPY指令
若是<src>爲url且<dest>不以/結尾,則<src>指定的文件講被下載並直接被建立爲<dest>,如<dest>以/結尾,則文件名url指定的文件將被直接下載並保存爲<dest>/<filename>
若是<src>是一個本地系統上的壓縮格式的tar文件,它將被展開爲一個目錄,相似於"tar -x"命令,而經過url獲取的tar文件講不會自動展開
若是<src> 有多個,或去簡介或直接使用通配符,則<dest> 必須以/結尾
WORKDIR
用於爲Dockerfile中全部的RUN、CMD、ENTRYPOINT、COPY和ADD指定設定工做目錄
語法:
WORKDIR <dirpath>
在dockerfille文件中,WORKDIR指定能夠出現屢次,其路徑也能夠爲相對路徑,不過,其實對象此前一個WORKDIR指定的路徑。
另外,WORKDIR也可調用由ENV指定定義的變量
例如:
WORKDIR /var/log
WORKDIR $STAATEPATH
VOLUME
用於在image中建立以一個掛載點目錄,以掛載Docker host 上的卷或其餘容器上的卷
語法:
VOLUME <mountpoint> 或 VOLUME ["mountpoint"]
r若是掛載點目錄路徑下此前在文件中存在, docker run命令會在卷掛載完成後將此前全部文件複製到新掛載的卷中
EXPOSE
用於爲容器打開指定要監聽的端口以實現外部通訊
語法:
EXPOSE <port>[/<protocol>] [<port>[/<protocol>]...]
<protocol>用於指定傳輸層協議,tcp或udp 默認是tcp
EXPOAE指令可一次執行多個端口,例如:
EXPOSE 11211/udp 11211/tcp
ENV
用於爲鏡像定義所需的環境變量,並可被Dockerfile文件中位於其後的其它指定
(如ENV、ADD、COPY)鎖調用
調用格式爲$variable_name或${variable_name}
語法:
ENV <key><value>或ENV<value>=<value>
第一種格式中<key> 以後的全部內容均會視其爲<value>的租車鞥部分,所以一次只能設置一個值
第二個格式可用一次設置多個變量,若是value中包含空格可用\轉義,或雙引號
RUN
用於指定docker build過程當中運行的程序,其能夠是任何命令
語法:
RUN <command> 或 RUN ["<executable>","<param1>","<param2>"]
第一種格式中<command>一般是一個shell命令,且以"/bin/sh -c" 來運行,意味着此進程在容器中的PID不爲1,不能接收Unix信號 使用docker <container> stop 來中止容器時 此進程收不到sigterm信號
第二種語法格式中的參數是一個JSON格式的數組,其中"<executable>"爲要運行的命令,後面的爲要傳遞給命令的選項值,而這種格式指定的命令不會以"/bin/sh -c" 來運行
CMD
定義一個鏡像文件啓動爲容器時默認要運行的一個程序,能夠給多個,可是隻有最後一個生效
語法:
CMD <command>
CMD ["<executable>","<param1>","<pa>"]
CMD ["<param1>","<param2>"]
前兩種語法格式意義同RUN
第三種則用於ENTERPOINT指令提供默認參數
ENTRYPOINT
相似CMD指令的功能,用於爲容器指定默認運行程序,從而使得容器像是一個單獨的可執行程序
與CMD不一樣的是,由ENTRYPOINT啓動的程序不會被docker run 命令行指定的參數覆蓋,並且這些命令行參數會被看成參數傳遞給ENTRYPOINT指定的程序
可是docker run命令的--entrpoint選項的參數可覆蓋entrypoint指令指定的程序
語法:
ENTRYPOINT <COMMAND>
ENTRYPOINT ["<executable>","<param1>","<param2>"]
docker run 命令傳入的命令參數會覆蓋CMD指令的內容而且附加到ENTRYPOINT命令最後做爲其參數使用
Dockerfile文件中也能夠存在多個ENTRYPOINT指令,但僅最後一個生效
USER
用於指定運行image時或運行dockerfile中任何RUN、CMD或entrypoint指令指定的程序時的用戶UID
默認狀況下container的運行身份爲root用戶
語法:
USER <UID> | <UserName>
<UID>能夠是任意數字,但實踐中其必須爲/etc/paword中某個用戶的有效UID,不然docker run命令將運行失敗
HEALTHCHECH
詳情待補充
SHELL
STOPSIGNAL
ARG
ONBUILD:
用於在Dockerfile中定義一個觸發器,
執行時間:
作成鏡像之後別人用此鏡像做爲基礎鏡像的時候纔會執行