Dockerfile文件編寫官方文檔

Dockerfile文件編寫官方文檔

2017年05月04日 20:08:33 閱讀數:2046更多nginx

我的分類: 服務器運維git

英文原文連接地址: Engine reference–>Dockerfile referencedocker

推薦你們直接看官方英文文檔就行了shell

 

 

如下內容會幫助你們瞭解什麼是Dockerfile,以及如何編寫Dockerfile,經過一些示例來幫助你們更快速理解和掌握編寫Dockerfile的方法。apache

什麼是Dockerfile文件

Dockerfile是一種能夠用於建立鏡像的文件,相似於makefile,它是一個包含了全部用於建立鏡像的命令的有序序列的文本文件。ubuntu

使用 Dockerfile的方法是:數組

$ > docker build -t 'ubuntu:git' .
Sending build context to Docker daemon 59.39 kB
Step 1 : FROM ubuntu
---> c5f1cf30c96b
Step 2 : CMD apt-get update && apt-get upgrade
---> Running in ccb83c0f7e1d
---> a35ebd488b21
Removing intermediate container ccb83c0f7e1d
Step 3 : CMD apt-get install git
---> Running in 39a8134ca865
---> e516586de6ce
Removing intermediate container 39a8134ca865
Successfully built e516586de6ce

$ > docker images
REPOSITORY           TAG                 IMAGE ID            CREATED              SIZE
ubuntu               git                 e516586de6ce        About a minute ago   120.8 MB

編寫Dockerfile文件

Dockerfile文件的格式以下bash

# Comment
INSTRUCTION arguments

#井號開頭的表示註釋行;服務器

INSTRUCTION指令是不區分大小寫的,可是爲了便於區分建議使用全大寫格式。網絡

.dockerignore 文件

這個文件的做用是根據文件內定義的規則過濾掉不須要 push的文件。

過濾規則:

 
  1. *.md

  2. !README.md

*.md過濾掉全部以.md結尾的文件, !README.md不過濾README.md文件。

命令列表介紹

ENV

設置環境變量指令,用法 ENV WORKPATH /tmp,也能夠這樣: ENV abc=bye def=$abc。第一種用法用於設置單個變量(第一個空格前爲key,以後都是value,包括後面的空格),第二種用於同時設置多個變量(空格爲分隔符,value中包含空格時能夠用雙引號把value括起來,或者在空格前加\反斜線),當須要同時設置多個環境變量時推薦使用第二種格式。

ENV用法以下:

ENV <key> <value>
ENV <key>=<value> ...

示例:
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy

ENV myName="John Doe" myDog=Rex\ The\ Dog \
    myCat=fluffy

FROM

設置基礎鏡像,一個有效的Dockerfile必須有一個 FROM指令指定一個基礎鏡像,這個鏡像能夠是任何你能夠從共用倉庫獲取到的鏡像。執行命令格式 FROM <image>或者 FROM <image>:<tag>或者 FROM <image>@<digest>,下面是一些注意信息:

 
  1. - `FROM`指令必須是第一個非註釋的指令;

  2. - `FROM`能夠在一個Dockerfile中出現屢次,好比咱們建立多個鏡像時,在新的`FROM`指令以前只須要輸出最後一次提交的鏡像ID。

  3. - `tag`和`digest`值是可選的,若是都沒有填寫這兩個值則取默認的`latest`.若是沒法匹配`tag`值會返回一個錯誤。

MAINTAINER

設置建立鏡像的做者信息。

RUN

這個指令有兩種格式.

第一種形式: RUN <command>(以shell形式執行命令,等同於 /bin/sh -c);

第二種形式: RUN ["executable", "param1", "param2"](等同於exec命令形式),注意此處必須是雙引號(「),由於這種格式被解析爲JSON數組。

關於 RUN指令的說明:

 
  1. - 每個RUN指令都會在最頂層上新建一層上執行而且提交執行結果.提交後的iamge將會用於`Dockerfile`中的下一步操做。

  2. - 分層的`RUN`指令和生成提交符合Docker的核心概念,提交是廉價的,容器能夠再一個歷史鏡像的任意層,這個很像源碼控制。

  3. - 第二種`exec`格式能夠避免了shell字符串的改寫問題,以及避免了`RUN`命令執行所在的基礎鏡像中沒有`/bin/sh`的問題。

  4. - 在`shell`格式中咱們可使用\(反斜槓)把一個`RUN`指令切換到下一行。

  5.  
RUN /bin/bash -c 'source $HOME/.bashrc ;\
echo $HOME'

等同於

RUN /bin/bash -c 'source $HOME/.bashrc ; echo $HOME'
 
  1. - `RUN`指令的cache對於下一次的建立是有效的,對於`RUN apt-get dist-upgrade -y`指令的cache將會再下次建立的時候使用,若是想要使用取消使用cache須要使用`--no-cache`參數。

  2.  

CMD

此命令主要目的是爲一個正在執行的容器提供一些默認值,這些默認命令能夠包含一個可執行命令 executable,也能夠沒有(此時須要指定一個 ENTRYPOINT指令,此時 CMD和 ENTRYPOINT都必須使用 exec格式,即JSON數組格式)。

此命令有3種執行格式:

 
  1. - `CMD ["executable","param1","param2"]` ,`exec`格式,推薦使用這種格式。

  2. - `CMD ["param1","param2"]`,做爲`ENTRYPOINT`的默認參數。

  3. - `CMD command param1 param2`,`shell`格式。

  4.  

LABEL

爲鏡像填寫元數據 metadata信息,格式爲key-value對格式,一個鏡像能夠有多個 LABEL,可是建議儘可能放到同一個 LABEL指令下,由於每個 LABEL指令的執行都會產生新的一層,這樣會讓咱們獲得鏡像執行起來很低效。 LABEL定義的key能夠覆蓋鏡像以前定義國的key值,咱們能夠經過 docker inspect命令查看鏡像已經定義的標籤 LABEL信息。如下是一些示例:

LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
LABEL multi.label1="value1" multi.label2="value2" other="value3"
LABEL multi.label1="value1" \
      multi.label2="value2" \
      other="value3"

EXPOSE

此命令通知Docker容器監聽指定的網絡端口 <port>, EXPOSE指令不會讓容器的端口訪問host主機,若是想要這樣作就須要在運行容器的時候指定 -pflag發佈一個端口範圍或者 -Pflag發佈全部打開的端口, 詳細介紹參考 expose-incoming-ports

EXPOSE

用法爲 EXPOSE <port> [<port>...]

ADD

此指令用於複製新文件、目錄或者遠程URL地址添加到容器的指定 <dest>路徑下,指令包含兩種形式:

ADD <src>... <dest>
ADD ["<src>",... "<dest>"] (this form is required for paths containing whitespace)
  • 對於 ADD指令,能夠有多個 <src>資源被指定,假如這些資源是文件或者目錄,則這些資源的路徑必須爲相對與build的工做路徑,而不是絕對路徑,並且每一個 <src>能夠包含通配符,匹配規則是由Go語言的filepath.Match函數完成。
ADD hom* /mydir/        # adds all files starting with "hom"
ADD hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"
  • 對於 <dest>是一個絕對路徑或者是相對於 WORKDIR的相對路徑。
ADD test relativeDir/          # adds "test" to `WORKDIR`/relativeDir/
ADD test /absoluteDir/         # adds "test" to /absoluteDir/
  • 全部的文件和目錄添加到容器中時的 UID和 GID都是 0。
  • 當 <src>爲URL時, <dest>路徑須要是600權限。若是遠端獲取的文件有HTTP Last-Modified頭部信息,將會使用此時間戳做爲文件的最後修改時間 mtime

ADD遵循以下規則:

  • 路徑必須在buid的環境內;不能夠指定 ADD ../something /something,由於建立鏡像build的第一步是將buid的環境目錄內容發送給 docker daemon進程。
  • 若是 <src>是URL而且 <dest>不是以斜槓(/)結束,那麼一個文件將會下載下來後再複製到 <dest>
  • 若是 <src>是URL而且 <dest>以斜槓(/)結束,那麼將會下載下來URL指定的文件名到 <dest>下。
  • 若是 <src>是一個目錄,則整個目錄下(目錄自己不被複制)內容和元數據信息也會被複制到 <dest>中。
  • 若是 <src>是一個本地tar包的壓縮包(gzip/bzip2/xz),則此壓縮包會先被解壓處理,而遠端的URL不會被解壓。當一個目錄

COPY

COPY有兩種格式:

  • COPY <src> ... <dest>
  • COPY [ "<src>",..."<dest>"](這種格式須要路徑包含空格)

COPY指令從 <src>複製新文件或者目錄而後添加到容器文件系統中的 <dest>路徑。

也能夠有多個 <src>資源被指定,假如這些資源是文件或者目錄,則這些資源的路徑必須爲相對與build的工做路徑,而不是絕對路徑,並且每一個 <src>能夠包含通配符,匹配規則是由Go語言的filepath.Match函數完成。如下是示例:

COPY hom* /mydir/        # adds all files starting with "hom"
COPY hom?.txt /mydir/    # ? is replaced with any single character, e.g., "home.txt"

對於 <dest>是一個絕對路徑或者是相對於 WORKDIR的相對路徑。

COPY test relativeDir/   # adds "test" to `WORKDIR`/relativeDir/
COPY test /absoluteDir/  # adds "test" to /absoluteDir/

全部的文件和目錄添加到容器中時的 UID和 GID都是 0。

Note: 若是使用STDIN建立build鏡像( docker build - < somefile), 因爲沒有build上下文,因此 COPY指令沒法使用。

COPY遵循以下規則:

  • 路徑必須在buid的環境內;不能夠指定 COPY ../something /something,由於建立鏡像build的第一步是將buid的環境目錄內容發送給 docker daemon進程。
  • 若是 <src>是一個目錄,則整個目錄下(目錄自己不被複制)內容和元數據信息也會被複制到 <dest>中。
  • 若是 <src>是任何其餘種類的文件,它被單獨連同其元數據複製。這種場景下,若是 <dest>是斜線(/)結尾,它會被看成目錄,而後被寫到 <dest>/base(<src>).
  • 對於多個 <src>資源指定時, <dest>必須是一個目錄,而且以斜線(/)結尾。
  • 若是 <dest>不是以斜線(/)結尾,它將被看成一個普通文件,而且 <src>將會寫到 <dest>中。

ENTRYPOINT

ENTRYPOINT有兩種格式:

  • ENTRYPOINT ["executable", "param1", "param2"](exec 格式,推薦)
  • ENTRYPOINT command param1 param2(shell 格式)

ENTRYPOINT指令容許咱們爲配置一個做爲運行某個命令的容器。例以下面將啓動nginx做爲運行容器的默認內容,監聽80端口:

docker run -i -t --rm -p 80:80 nginx

docker run <image>的命令行參數會在 exec格式的 ENTRYPOINT指令後追加,而且覆蓋全部 CMD指令指定的全部元素。因此這使得參數能夠傳遞到入口點,例如, docker run <image> -d將會吧 -d參數傳給入口點 ENTRYPOINT. 咱們可使用 docker run --entrypoint標識來覆蓋 ENTRYPOINT指令。

shell形式的指令避免任何 CMD或者 run使用命令行參數,可是缺點是 ENTRYPOINT指令會做爲/bin/sh -c進程的子進程來運行,這意味着沒法收到容器中來自 PID 1UNIX信號,因此進程將沒法經過 docker stop <container>收到 SIGTERM信號。

記住一個Dockerfile中只有最後一個 ENTRYPOINT指令會生效。

Exec 格式的 ENTRYPOINT示例

FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

咱們運行容器後,會看到 top將是惟一一個進程。

$ docker run -it --rm --name test  image-top -H
top - 08:25:00 up  7:27,  0 users,  load average: 0.00, 0.01, 0.05
Threads:   1 total,   1 running,   0 sleeping,   0 stopped,   0 zombie
%Cpu(s):  0.1 us,  0.1 sy,  0.0 ni, 99.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem:   2056668 total,  1616832 used,   439836 free,    99352 buffers
KiB Swap:  1441840 total,        0 used,  1441840 free.  1324440 cached Mem

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+ COMMAND
    1 root      20   0   19744   2336   2080 R  0.0  0.1   0:00.04 top

咱們可使用 docker exec來深刻的瞭解下具體狀況:

 
  1. docker exec -it test ps aux

  2. USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

  3. root 1 2.6 0.1 19752 2352 ? Ss+ 08:24 0:00 top -b -H

  4. root 7 0.0 0.1 15572 2164 ? R+ 08:25 0:00 ps aux

咱們可使用 docker stop test來中止 top進程。

下面的 Dockerfile顯示的是使用 ENTRYPOINT來前臺運行Apache(PID爲1):

FROM debian:stable
RUN apt-get update && apt-get install -y --force-yes apache2
EXPOSE 80 443
VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2"]
ENTRYPOINT ["/usr/sbin/apache2ctl", "-D", "FOREGROUND"]

咱們能夠爲一個單獨的可執行命令編寫一個啓動腳本,這樣咱們就能夠經過 gosu和 exec來確保這個最後執行的命令能夠獲取到Unix信號,下面就是一個腳本示例

#!/bin/bash
set -e

if [ "$1" = 'postgres' ]; then
    chown -R postgres "$PGDATA"

    if [ -z "$(ls -A "$PGDATA")" ]; then
        gosu postgres initdb
    fi

    exec gosu postgres "$@"
fi

exec "$@"

最後,若是咱們須要在關機或者與其餘可執行程序進行協調時進行一些額外清理工做(或者與其餘容器通訊),咱們就須要確保 ENTRYPOINT腳本能夠獲取到Unix信號,而後經過他們咱們能夠作更多的工做:

#!/bin/sh
# Note: I've written this using sh so it works in the busybox container too

# USE the trap if you need to also do manual cleanup after the service is stopped,
#     or need to start multiple services in the one container
trap "echo TRAPed signal" HUP INT QUIT TERM

# start service in background here
/usr/sbin/apachectl start

echo "[hit enter key to exit] or run 'docker stop <container>'"
read

# stop service and clean up here
echo "stopping apache"
/usr/sbin/apachectl stop

echo "exited $0"

咱們能夠執行命令 docker run -it --rm -p 80:80 --name test apache啓動一個容器,而後經過 docker exec或者 docker top來檢查容器中的進程,而後經過腳本中止Apache(此時中止時間很快) :

$ docker exec -it test ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.1  0.0   4448   692 ?        Ss+  00:42   0:00 /bin/sh /run.sh 123 cmd cmd2
root        19  0.0  0.2  71304  4440 ?        Ss   00:42   0:00 /usr/sbin/apache2 -k start
www-data    20  0.2  0.2 360468  6004 ?        Sl   00:42   0:00 /usr/sbin/apache2 -k start
www-data    21  0.2  0.2 360468  6000 ?        Sl   00:42   0:00 /usr/sbin/apache2 -k start
root        81  0.0  0.1  15572  2140 ?        R+   00:44   0:00 ps aux
$ docker top test
PID                 USER                COMMAND
10035               root                {run.sh} /bin/sh /run.sh 123 cmd cmd2
10054               root                /usr/sbin/apache2 -k start
10055               33                  /usr/sbin/apache2 -k start
10056               33                  /usr/sbin/apache2 -k start
$ /usr/bin/time docker stop test
test
real	0m 0.27s
user	0m 0.03s
sys	0m 0.03s

註釋說明:

 
  1. > Note:咱們可使用`--entrypoint`參數來覆蓋`ENTRYPOINT`設置,可是這智能設置exec模式(不會執行sh -c)

  2. > Note:仍是說明`exec`格式的指令會被解析爲JSON數組格式,咱們使用的應該是雙引號(")而不是單引號(');

  3. > Note:跟 *shell* 格式不一樣, *exec* 格式不會調用一個shell命令,例如執行`ENTRYPOINT [ "echo", "$HOME" ]`就不會獲取到變量`$HOME`信息。不過咱們能夠執行這個命令來執行shell命令`ENTRYPOINT [ "sh", "-c", "echo", "$HOME" ]` 。另外咱們在`Dockerfile`中須要使用`ENV`來定義咱們須要使用的變量。

  4.  

Shell格式的 ENTRYPOINT示例

咱們能夠爲 ENTRYPOINT指定一個文本字符串做爲命令,而後它將在 /bin/sh -c下被執行。這種格式會使用shell處理來替代shell環境變量,而且會忽略任何 CMD或者 docker run命令行參數。

爲了確保 docker stop能夠正確的發送號給全部在運行中的 ENTRYPOINT可執行程序,咱們須要記住要使用 exec做爲 ENTRYPOINT命令的開始,以下示例:

FROM ubuntu
ENTRYPOINT exec top -b

當咱們運行這個鏡像時,咱們會看到一個 PID 1的進程:

$ docker run -it --rm --name test top
Mem: 1704520K used, 352148K free, 0K shrd, 0K buff, 140368121167873K cached
CPU:   5% usr   0% sys   0% nic  94% idle   0% io   0% irq   0% sirq
Load average: 0.08 0.03 0.05 2/98 6
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
    1     0 root     R     3164   0%   0% top -b

當咱們中止容器運行時,它將會完全的退出:

$ /usr/bin/time docker stop test
test
real    0m 0.20s
user    0m 0.02s
sys 0m 0.04s

若是咱們忘記添加 exec到命令的開始位置 :

FROM ubuntu
ENTRYPOINT top -b

咱們運行後的效果會是這樣的:

$ docker run -it --name test top
Mem: 1704184K used, 352484K free, 0K shrd, 0K buff, 140621524238337K cached
CPU:   9% usr   2% sys   0% nic  88% idle   0% io   0% irq   0% sirq
Load average: 0.01 0.02 0.05 2/101 7
  PID  PPID USER     STAT   VSZ %VSZ %CPU COMMAND
    1     0 root     S     3168   0%   0% /bin/sh -c top -b
    7     1 root     R     3164   0%   0% top -b

咱們看到了 PID 1的進程不是 top命令,而是 /bin/sh -c,而後咱們執行 docker stop test中止容器的運行,容器不會完全的退出,stop命令將會被迫在超時後發送 SIGKILL信號:

$ docker exec -it test ps aux
PID   USER     COMMAND
    1 root     /bin/sh -c top -b cmd cmd2
    7 root     top -b
    8 root     ps aux
$ /usr/bin/time docker stop test
test
real    0m 10.19s
user    0m 0.04s
sys 0m 0.03s

理解 CMD和 ENTRYPOINT是如何相互做用的

CMD和 ENTRYPOINT兩個指令都定義了當運行一個容器時要執行的命令。有以下幾條規則描述它們之間的相互做用:

 
  1. 1. `Dockerfile`應該指定至少`CMD`或者`ENTRYPOINT`中的一個指令。

  2. 2. 當容器做爲一個可執行程序時應該指定`ENTRYPOINT`指令。

  3. 3. `CMD`應當被用來做爲一種爲`ENTRYPOINT`提供默認參數的方式來使用,或者執行容器中的特定(ad-hoc)命令。

  4. 4. `CMD`指令參數能夠被運行容器時傳入的替代參數覆蓋掉。

  5.  

下表展現了 CMDENTRYPOINT命令執行狀況 :

  No ENTRYPOINT ENTRYPOINT exec_entry p1_entry ENTRYPOINT [「exec_entry」, 「p1_entry」]
No CMD error,not allowed /bin/sh -c exec_entry p1_entry exec_entry p1_entry
CMD [「exec_cmd」, 「p1_cmd」] exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry exec_cmd p1_cmd exec_entry p1_entry exec_cmd p1_cmd
CMD [「p1_cmd」, 「p2_cmd」] p1_cmd p2_cmd /bin/sh -c exec_entry p1_entry p1_cmd p2_cmd exec_entry p1_entry p1_cmd p2_cmd
CMD exec_cmd p1_cmd /bin/sh -c exec_cmd p1_cmd /bin/sh -c exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd exec_entry p1_entry /bin/sh -c exec_cmd p1_cmd

VOLUME

VOLUME [ "/data"]      (exec格式指令)
VOLUME /data             (shell格式指令)

VOLUME指令建立一個能夠從本地主機或其餘容器掛載的掛載點,該指令參數能夠是JSON數組(如 VOLUMN ["/var/log/"]),也能夠是多個參數的文本字符串(如: VOLUMN /var/log /var/db)。更多關於掛載信息可訪問 Share Directories via Volumes

docker run命令用基礎鏡像中指定目錄位置數據來初始化新建立卷。以下示例:

FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
RUN echo "hello world" > /myvol/greeting.discarded   (這條數據修改內容最終會被丟棄)

這個Dockerfile執行的結果是建立了一個新掛載點/myvol,而後複製greetging文件到新建立的卷。

Note:在build建立鏡像的步驟中, 若是是在Volume聲明後修改卷數據,那麼這些修改最終會被丟棄。Note: 須要說明在使用JSON數組格式指令時要使用雙引號(「),而不是單引號(‘)。

USER

USER daemon

USER指令用來設置再 Dockerfile中要使用的用戶名或者 UID

WORKDIR

WORKDIR /path/to/workdir

WORKDIR指令用來設置 Dockerfile中任何使用目錄的命令的當前工做目錄,此目錄若是不存在就會被自動建立,即便這個目錄不被使用。此命令也可使用 Dockerfile中用 ENV定義的環境變量,例如:

ENV DIRPATH /path
WORKDIR $DIRPATH/$DIRNAME
RUN pwd

ARG

ARG <name>[=<default value>]

ARG指令設置一些建立鏡像時的參數,這些參數能夠在執行 docker build命令時經過 --build-arg <varname>=<value>設置,若是指定的建立參數在 Dockerfile中沒有指定,建立時會輸出錯誤信息: One or more build-args were not consumed, failing build.

Dockerfile 做者能夠爲 ARG設置一個默認參數值,當建立鏡像時若是沒有傳入參數就會使用默認值:

FROM busybox
ARG user1=someuser
ARG buildno=1

咱們可使用 ARG或者 ENV指令來指定 RUN指令使用的變量。咱們可使用 ENV定義與 ARG定義名稱相同的變量來覆蓋 ARG定義的變量值。以下示例,咱們執行 $ docker build --build-arg CONT_IMG_VER=v2.0.1 Dockerfile後將獲取到的CONT_IMG_VER變量值爲 v1.0.0:

FROM ubuntu
ARG CONT_IMG_VER
ENV CONT_IMG_VER v1.0.0
RUN echo $CONT_IMG_VER

咱們還能夠變換一下 ENV指令內容來增長一些更豐富的功能(好比: ENV CONT_IMG_VER ${CONT_IMG_VER:-v1.0.0}).

另外,Docker有些預約義的 ARG變量,不須要提早聲明就可使用,好比以下幾個:

 
  1. - HTTP_PROXY

  2. - http_proxy

  3. - HTTPS_PROXY

  4. - https_proxy

  5. - FTP_RPOXY

  6. - ftp_proxy

  7. - NO_PROXY

  8. - no_proxy

咱們能夠經過使用 --build-arg <varname>=<value>來傳遞參數值到 Dockerfile中。

ONBUILD

ONBUILD [INSTRUCTION]

ONBUILD指令爲鏡像提供了一個觸發器 trigger指令功能,當這個鏡像被做爲基礎鏡像執行建立時會自動觸發設定的指令被執行,執行過程就至關於在 Dockerfile中的 FROM指令後面當即插入了這條指令同樣。

這個命令很是有幫助,好比對於應用建立環境咱們能夠用它來自定義用戶指定的配置。

須要注意的是:

 
  1. 1. 當使用`ONBUILD`建立鏡像時,這個觸發器會添加到建立後的鏡像上,之後以這個新的鏡像做爲基礎鏡像進行建立新鏡像時纔會觸發這個觸發器。

  2. 2. 在建立鏡像的最後,添加的觸發器會存儲到鏡像的`manifest`清單中,咱們能夠經過`docker inspect`查看`OnBuild`的信息。

  3. 3. 當帶有`ONBUILD`信息的鏡像經過`FROM`做爲新鏡像的基礎鏡像時,首先builder會查找`OnBuild`觸發器信息,而後按照註冊的前後順序依次執行每個觸發器,若是任何一個觸發器執行失敗,則`FROM`停止build的執行。若是全部觸發器都執行成功,則`FROM`指令執行完成,而且繼續向下執行。

  4. 4. 觸發器在執行一次以後生成的鏡像中就會被清理掉,它不會被繼承到下一個鏡像中。

Note: ONBUILD不支持嵌套 ONBUILD,另外 ONBUILD指令不能夠觸發 FROM或者 MAINTAINER

STOPSIGNAL

STOPSIGNAL signal

STOPSIGNAL指令用來設置用來發送給容器退出的系統調用信號。這個信號能夠是系統調用表中的數字,也能夠是信號名稱,格式爲 SIGNAME,例如 SIGKILL.

Dockerfile 示例

如下內容是一些簡單的Dockerfile示例,若是感興趣能夠訪問 Dockerization examples瞭解更多內容:

示例1:

 
  1. # Nginx

  2. #

  3. # VERSION 0.0.1

  4.  
  5. FROM ubuntu

  6. MAINTAINER Victor Vieux <victor@docker.com>

  7.  
  8. LABEL Description="This image is used to start the foobar executable" Vendor="ACME Products" Version="1.0"

  9. RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server

示例2:

# Firefox over VNC
#
# VERSION               0.3

FROM ubuntu

# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN apt-get update && apt-get install -y x11vnc xvfb firefox
RUN mkdir ~/.vnc
# Setup a password
RUN x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'

EXPOSE 5900
CMD    ["x11vnc", "-forever", "-usepw", "-create"]

示例3:

# Multiple images example
#
# VERSION               0.1

FROM ubuntu
RUN echo foo > bar
# Will output something like ===> 907ad6c2736f

FROM ubuntu
RUN echo moo > oink
# Will output something like ===> 695d7793cbe4

# You᾿ll now have two images, 907ad6c2736f with /bar, and 695d7793cbe4 with
# /oink.
相關文章
相關標籤/搜索