Dockerfile文件詳解

如果你看到這里證明你已經知道這個文件能做什么和怎么用了,這里就不再熬述這些,直接切入正題看看這個文件支持的各項功能吧!

1、FROM

語法:

FROM <image>[:<tag>]

解釋:設置要制作的鏡像基于哪個鏡像,FROM指令必須是整個Dockerfile的第一個指令,如果指定的鏡像不存在默認會自動從 Docker Hub上下載。

2、MAINTAINAER

語法:

MAINTAINER <name>

解釋:MAINTAINER指令允許你給將要制作的鏡像設置作者信息。

3、RUN

語法:

1、RUN <command>  #將會調用/bin/sh -c <command>
2、RUN ["executable", "param1", "param2"] #將會調用exec執行,以避免有些時候shell方式執行時的傳遞參數問題,而且有些基礎鏡像可能不包含/bin/sh

解釋:RUN指令會在一個新的容器中執行任何命令,然后把執行后的改變提交到當前鏡像,提交后的鏡像會被用于Dockerfile中定義的下一步操作,RUN中定義的命令會按順序執行并提交,這正是Docker廉價的提交和可以基于鏡像的任何一個歷史點創建容器的好處,就像版本控制工具一樣。

4、ENTRYPOINT

語法:

1、ENTRYPOINT ["executable", "param1", "param2"]        #將會調用exec執行,首選方式
2、ENTRYPOINT command param1 param2             #將會調用/bin/sh -c執行

解釋:ENTRYPOINT指令中指定的命令會在鏡像運行時執行,在Dockerfile中只能存在一個,如果使用了多個ENTRYPOINT指令,則只有最后一個指令有效。ENTRYPOINT指令中指定的命令(exec執行的方式)可以通過docker run來傳遞參數,例如docker run <images> -l啟動的容器將會把-l參數傳遞給ENTRYPOINT指令定義的命令并會覆蓋CMD指令中定義的默認參數(如果有的話),但不會覆蓋該指令定義的參數,例如ENTRYPOINT ["ls","-a"],CMD ["/etc"],當通過docker run <image>啟動容器時該容器會運行ls -a /etc命令,當使用docker run <image> -l啟動時該容器會運行ls -a -l命令,-l參數會覆蓋CMD指令中定義的/etc參數。

注意:
①當使用ENTRYPOINT指令時生成的鏡像運行時只會執行該指令指定的命令。
②當出現ENTRYPOINT指令時CMD指令只可能(當ENTRYPOINT指令使用exec方式執行時)被當做ENTRYPOINT指令的參數使用,其他情況則會被忽略。

5、CMD

語法:

1、CMD ["executable", "param1", "param2"]    #將會調用exec執行,首選方式
2、CMD ["param1", "param2"]        #當使用ENTRYPOINT指令時,為該指令傳遞默認參數
3、CMD <command> [ <param1>|<param2> ]        #將會調用/bin/sh -c執行

解釋:CMD指令中指定的命令會在鏡像運行時執行,在Dockerfile中只能存在一個,如果使用了多個CMD指令,則只有最后一個CMD指令有效。當出現ENTRYPOINT指令時,CMD中定義的內容會作為ENTRYPOINT指令的默認參數,也就是說可以使用CMD指令給ENTRYPOINT傳遞參數。

注意:RUN和CMD都是執行命令,他們的差異在于RUN中定義的命令會在執行docker build命令創建鏡像時執行,而CMD中定義的命令會在執行docker run命令運行鏡像時執行,另外使用第一種語法也就是調用exec執行時,命令必須為絕對路徑。

6、EXPOSE

語法:

EXPOSE <port> [.....]

解釋:EXPOSE指令用來告訴Docker這個容器在運行時會暴露哪些端口,Docker在連接不同的容器(使用–link參數)時使用這些信息。

7、ENV

語法:

ENV <key> <value>

解釋:
ENV指令用于設置環境變量,在Dockerfile中這些設置的環境變量也會影響到RUN指令,當運行生成的鏡像時這些環境變量依然有效,如果需要在運行時更改這些環境變量可以在運行docker run時添加–env <key>=<value>參數來修改。

注意:最好不要定義那些可能和系統預定義的環境變量沖突的名字,否則可能會產生意想不到的結果。

8、ADD

語法:

ADD <src> <dest>

解釋:
ADD指令用于從指定路徑拷貝一個文件或目錄到容器的指定路徑中,<src>是一個文件或目錄的路徑,也可以是一個url,路徑是相對于該Dockerfile文件所在位置的相對路徑,<dest>是目標容器的一個絕對路徑,例如/home/yooke/Docker/Dockerfile這個文件中定義的,那么ADD /data.txt /db/指令將會嘗試拷貝文件從/home/yooke/Docker/data.txt到將要生成的容器的/db/data.txt,且文件或目錄的屬組和屬主分別為uid和gid為0的用戶和組,如果是通過url方式獲取的文件,則權限是600。

注意:
①如果執行docker build – < somefile即通過標準輸入來創建時,ADD指令只支持url方式,另外如果url需要認證,則可以通過RUN wget …或RUN curl …來完成,ADD指令不支持認證。

②<src>路徑必須與Dockerfile在同級目錄或子目錄中,例如不能使用ADD ../somepath,因為在執行docker build時首先做的就是把Dockerfile所在目錄包含子目錄發送給docker的守護進程。

③如果<src>是一個url且<dest>不是以”/“結尾,則會下載文件并重命名為<dest>。

④如果<src>是一個url且<dest>以“/”結尾,則會下載文件到<dest>/<filename>,url必須是一個正常的路徑形式,“http://example.com”像這樣的url是不能正常工作的。

*⑤如果<src>是一個本地的壓縮包且<dest>是以“/”結尾的目錄,則會調用“tar -x”命令解壓縮,如果<dest>有同名文件則覆蓋,但<src>是一個url時不會執行解壓縮.

9、COPY

語法:

COPY <src> <dest>

解釋:用法與ADD相同,不過<src>不支持使用url,所以在使用docker build – < somefile時該指令不能使用。

10、VOLUME

語法:

VOLUME ["samepath"]

解釋:
VOLUME指令用來設置一個掛載點,可以用來讓其他容器掛載以實現數據共享或對容器數據的備份、恢復或遷移。

11、USER

語法:

USER [username|uid]

解釋:
USER指令用于設置用戶或uid來運行生成的鏡像和執行RUN指令。

12、WORKDIR

語法:

WORKDIR /path/to/workdir

解釋:
WORKDIR指令用于設置Dockerfile中的RUN、CMD和ENTRYPOINT指令執行命令的工作目錄(默認為/目錄),該指令在Dockerfile文件中可以出現多次,如果使用相對路徑則為相對于WORKDIR上一次的值,例如WORKDIR /data,WORKDIR logs,RUN pwd最終輸出的當前目錄是/data/logs。

13、ONBUILD

語法:

ONBUILD [INSTRUCTION]

解釋:
a、ONBUILD指令可以為鏡像添加觸發器。其參數是任意一個Dockerfile 指令。
當我們在一個Dockerfile文件中加上ONBUILD指令,該指令對利用該Dockerfile構建鏡像(比如為A鏡像)不會產生實質性影響。
b、但是當我們編寫一個新的Dockerfile文件來基于A鏡像構建一個鏡像(比如為B鏡像)時,這時構造A鏡像的Dockerfile文件中的ONBUILD指令就生效了,在構建B鏡像的過程中,首先會執行ONBUILD指令指定的指令,然后才會執行其它指令。
c、需要注意的是,如果是再利用B鏡像構造新的鏡像時,那個ONBUILD指令就無效了,也就是說只能再構建子鏡像中執行,對孫子鏡像構建無效。其實想想是合理的,因為在構建子鏡像中已經執行了,如果孫子鏡像構建還要執行,相當于重復執行,這就有問題了。
d、利用ONBUILD指令,實際上就是相當于創建一個模板鏡像,后續可以根據該模板鏡像創建特定的子鏡像,需要在子鏡像構建過程中執行的一些通用操作就可以在模板鏡像對應的dockerfile文件中用ONBUILD指令指定。 從而減少dockerfile文件的重復內容編寫。

實例(僅供參考)

FROM php:7.0-fpm

RUN sed -i 's/deb\.debian\.org/mirrors.aliyun.com/' /etc/apt/sources.list && sed -i 's/security\.debian\.org/mirrors.aliyun.com\/debian-security/' /etc/apt/sources.list

RUN apt-get update && apt-get install -y \
    --no-install-recommends \
    libfreetype6-dev \
    libjpeg62-turbo-dev \
    libmcrypt-dev \
    libpng12-dev \
 && rm -rf /var/lib/apt/lists/* \
 && docker-php-ext-configure gd \
    --with-freetype-dir=/usr \
    --with-jpeg-dir=/usr \
 && docker-php-ext-install -j$(nproc) \
    gd \
    mcrypt \
    zip \
    pdo_mysql \
    opcache \
 && rm -rf /var/www/html

COPY ./conf/php.ini /usr/local/etc/php/conf.d/
COPY ./conf/opcache-recommended.ini /usr/local/etc/php/conf.d/

RUN usermod -u 1000 www-data

WORKDIR /var/www/

14、ARG

ARG是Docker1.9 版本才新加入的指令。
ARG 定義的變量只在建立 image 時有效,建立完成后變量就失效消失
ARG指令定義了一個變量,能讓用戶可以在構建期間使用docker build命令和其參數–build-arg =對這個變量賦值。如果用戶指定了一個構建參數沒有定義在Dockerfile的話,將輸出錯誤。

備注:如有解釋不妥之處歡迎指正。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • docker基本概念 1. Image Definition 鏡像 Image 就是一堆只讀層 read-only...
    慢清塵閱讀 8,815評論 1 21
  • 轉載自 http://blog.opskumu.com/docker.html 一、Docker 簡介 Docke...
    極客圈閱讀 10,532評論 0 120
  • 0. 前言 docker是什么?docker是用GO語言開發的應用容器引擎,基于容器化,沙箱機制的應用部署技術。可...
    sessionboy閱讀 3,883評論 2 49
  • Docker — 云時代的程序分發方式 要說最近一年云計算業界有什么大事件?Google Compute Engi...
    ahohoho閱讀 15,619評論 15 147
  • 本來想流逼哄哄學人家做個過程圖,還是失敗,中間擦涂顏色次數太多一不小心就手殘,不過還是有進步,對水彩的掌控...
    窩在家的黑貓閱讀 285評論 0 0