dockerfile是什么

dockerfile是:1、一個包含用于組合映像的命令的文本文檔;2、可以使用在命令行中調用任何命令;3、Docker通過讀取Dockerfile中的指令自動生成映像。

dockerfile是什么

什么是dockerfile?

Dockerfile是一個包含用于組合映像的命令的文本文檔??梢允褂迷诿钚兄姓{用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。

docker build命令用于從Dockerfile構建映像??梢栽赿ocker build命令中使用-f標志指向文件系統中任何位置的Dockerfile。

例:

docker?build?-f?/path/to/a/Dockerfile

回到頂部

Dockerfile的基本結構

Dockerfile 一般分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令,’#’ 為 Dockerfile 中的注釋。

回到頂部

Dockerfile文件說明

Docker以從上到下的順序運行Dockerfile的指令。為了指定基本映像,第一條指令必須是FROM。一個聲明以#字符開頭則被視為注釋。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。

在這里列出了一些常用的指令。

FROM:指定基礎鏡像,必須為第一個命令

格式:   FROM?<image>   FROM?<image>:<tag>   FROM?<image>@<digest> 示例:   FROM?mysql:5.6 注:   tag或digest是可選的,如果不使用這兩個值時,會使用latest版本的基礎鏡像</digest></image></tag></image></image>

MAINTAINER: 維護者信息

格式: ????MAINTAINER?<name> 示例: ????MAINTAINER?Jasper?Xu ????MAINTAINER?sorex@163.com ????MAINTAINER?Jasper?Xu?<sorex></sorex></name>

RUN:構建鏡像時執行的命令

RUN用于在鏡像容器中執行命令,其有以下兩種命令執行方式: shell執行 格式: ????RUN?<command> exec執行 格式: ????RUN?["executable",?"param1",?"param2"] 示例: ????RUN?["executable",?"param1",?"param2"] ????RUN?apk?update ????RUN?["/etc/execfile",?"arg1",?"arg1"] 注:   RUN指令創建的中間鏡像會被緩存,并會在下次構建中使用。如果不想使用這些緩存鏡像,可以在構建時指定--no-cache參數,如:docker?build?--no-cache</command>

ADD:將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget

格式: ????ADD?<src>...?<dest> ????ADD?["<src>",...?"<dest>"]?用于支持包含空格的路徑 示例: ????ADD?hom*?/mydir/??????????#?添加所有以"hom"開頭的文件 ????ADD?hom?.txt?/mydir/??????#???替代一個單字符,例如:"home.txt" ????ADD?test?relativeDir/?????#?添加?"test"?到?`WORKDIR`/relativeDir/ ????ADD?test?/absoluteDir/????#?添加?"test"?到?/absoluteDir/</dest></src></dest></src>

COPY:功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源

CMD:構建容器后調用,也就是在容器啟動時才進行調用。

格式: ????CMD?["executable","param1","param2"]?(執行可執行文件,優先) ????CMD?["param1","param2"]?(設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數) ????CMD?command?param1?param2?(執行shell內部命令) 示例: ????CMD?echo?"This?is?a?test."?|?wc?- ????CMD?["/usr/bin/wc","--help"] 注: ?  CMD不同于RUN,CMD用于指定在容器啟動時所要執行的命令,而RUN用于指定鏡像構建時所要執行的命令。

ENTRYPOINT:配置容器,使其可執行化。配合CMD可省去”application”,只使用參數。

格式: ????ENTRYPOINT?["executable",?"param1",?"param2"]?(可執行文件,?優先) ????ENTRYPOINT?command?param1?param2?(shell內部命令) 示例: ????FROM?ubuntu ????ENTRYPOINT?["top",?"-b"] ????CMD?["-c"] 注:    ENTRYPOINT與CMD非常類似,不同的是通過docker?run執行的命令不會覆蓋ENTRYPOINT,而docker?run命令中指定的任何參數,都會被當做參數再次傳遞給ENTRYPOINT。Dockerfile中只允許有一個ENTRYPOINT命令,多指定時會覆蓋前面的設置,而只執行最后的ENTRYPOINT指令。

LABEL:用于為鏡像添加元數據

格式: ????LABEL?<key>=<value>?<key>=<value>?<key>=<value>?... 示例:   LABEL?version="1.0"?description="這是一個Web服務器"?by="IT筆錄" 注:   使用LABEL指定元數據時,一條LABEL指定可以指定一或多條元數據,指定多條元數據時不同元數據之間通過空格分隔。推薦將所有的元數據通過一條LABEL指令指定,以免生成過多的中間鏡像。 ENV:設置環境變量 格式: ????ENV?<key>?<value>??#<key>之后的所有內容均會被視為其<value>的組成部分,因此,一次只能設置一個變量 ????ENV?<key>=<value>?...??#可以設置多個變量,每個變量為一個"<key>=<value>"的鍵值對,如果<key>中包含空格,可以使用來進行轉義,也可以通過""來進行標示;另外,反斜線也可以用于續行 示例: ????ENV?myName?John?Doe ????ENV?myDog?Rex?The?Dog ????ENV?myCat=fluffy</key></value></key></value></key></value></key></value></key></value></key></value></key></value></key>

EXPOSE:指定于外界交互的端口

格式: ????EXPOSE?<port>?[<port>...] 示例: ????EXPOSE?80?443 ????EXPOSE?8080 ????EXPOSE?11211/tcp?11211/udp 注:   EXPOSE并不會讓容器的端口訪問到主機。要使其可訪問,需要在docker?run運行容器時通過-p來發布這些端口,或通過-P參數來發布EXPOSE導出的所有端口</port></port>

VOLUME:用于指定持久化目錄

格式: ????VOLUME?["/path/to/dir"] 示例: ????VOLUME?["/data"] ????VOLUME?["/var/www",?"/var/log/apache2",?"/etc/apache2" 注:   一個卷可以存在于一個或多個容器的指定目錄,該目錄可以繞過聯合文件系統,并具有以下功能: 1?卷可以容器間共享和重用 2?容器并不一定要和其它容器共享卷 3?修改卷后會立即生效 4?對卷的修改不會對鏡像產生影響 5?卷會一直存在,直到沒有任何容器在使用它

WORKDIR:工作目錄,類似于cd命令

格式: ????WORKDIR?/path/to/workdir 示例: ????WORKDIR?/a??(這時工作目錄為/a) ????WORKDIR?b??(這時工作目錄為/a/b) ????WORKDIR?c??(這時工作目錄為/a/b/c) 注:   通過WORKDIR設置工作目錄后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都會在該目錄下執行。在使用docker?run運行容器時,可以通過-w參數覆蓋構建時所設置的工作目錄。

USER:指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。并且可以在之前創建所需要的用戶

?格式:   USER?user   USER?user:group   USER?uid   USER?uid:gid   USER?user:gid   USER?uid:group ?示例:   USER?www ?注:   使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構建完成后,通過docker?run運行容器時,可以通過-u參數來覆蓋所指定的用戶。

ARG:用于指定傳遞給構建運行時的變量

格式: ????ARG?<name>[=<default>] 示例: ????ARG?site ????ARG?build_user=www ONBUILD:用于設置鏡像觸發器 格式:   ONBUILD?[INSTRUCTION] 示例:   ONBUILD?ADD?.?/app/src   ONBUILD?RUN?/usr/local/bin/python-build?--dir?/app/src 注:   當所構建的鏡像被用做其它鏡像的基礎鏡像,該鏡像中的觸發器將會被鑰觸發</default></name>

以下是一個小例子:

#?This?my?first?nginx?Dockerfile #?Version?1.0 #?Base?images?基礎鏡像 FROM?centos #MAINTAINER?維護者信息 MAINTAINER?tianfeiyu? #ENV?設置環境變量 ENV?PATH?/usr/local/nginx/sbin:$PATH #ADD??文件放在當前目錄下,拷過去會自動解壓 ADD?nginx-1.8.0.tar.gz?/usr/local/?? ADD?epel-release-latest-7.noarch.rpm?/usr/local/?? #RUN?執行以下命令? RUN?rpm?-ivh?/usr/local/epel-release-latest-7.noarch.rpm RUN?yum?install?-y?wget?lftp?gcc?gcc-c++?make?openssl-devel?pcre-devel?pcre?&amp;&amp;?yum?clean?all RUN?useradd?-s?/sbin/nologin?-M?www #WORKDIR?相當于cd WORKDIR?/usr/local/nginx-1.8.0? RUN?./configure?--prefix=/usr/local/nginx?--user=www?--group=www?--with-http_ssl_module?--with-pcre?&amp;&amp;?make?&amp;&amp;?make?install RUN?echo?"daemon?off;"?&gt;&gt;?/etc/nginx.conf #EXPOSE?映射端口 EXPOSE?80 #CMD?運行以下命令 CMD?["nginx"]

相關免費推薦:編程視頻課程

? 版權聲明
THE END
喜歡就支持一下吧
點贊10 分享