Docker-Dockerfile

Dockerfile

docker可以通過Dockerfile的內容來自動構建鏡像。
Dockerfile是一個創建鏡像使用的命令的文本文件,使用docker build命令也可以配置Dockerfile中相應的內容來構建鏡像。

Dockerfile的指令選項:

  • FROM
  • MAINTAINER
  • RUN
  • CMD
  • EXPOSE
  • ENV
  • ADD
  • COPY
  • ENTRYPOINT
  • VOLUME
  • USER
  • WORKDIR
  • ONBUILD

一、FROM

用法:

FROM <image>​​
  • FROM指定構建鏡像的基礎源鏡像,如果本地沒有指定的鏡像,則會自動從 Docker 的公共庫 pull 鏡像下來。
  • FROM必須是 Dockerfile 中非註釋行的第一個指令,即一個 Dockerfile 從FROM語句開始。
  • FROM可以在一個 Dockerfile 中出現多次,即可在一個 Dockerfile 中創建多個鏡像。
  • 如果FROM語句沒有指定鏡像標籤,則默認使用latest標籤。

二、MAINTAINER

用法:

 MAINTAINER <name> 

指定創建鏡像的用戶。

三、RUN

用法:

RUN yum install -y nginx        

RUN是在構建鏡像時,在基礎鏡像(即:FROM指令引入的基礎鏡像源)上安裝一些軟件或者對基礎鏡像最一些操作。

注:
爲保持可讀性、方便理解、可維護性,可把長或者複雜的RUN語句使用\分隔符分成多行

例如:

FROM centos
MAINTAINER eugene
RUN yum install -y nginx
RUN echo 'hello world'>/index.html

以上兩個RUN指令分別是在構建鏡像時對基礎鏡像centos,安裝了nginx和對index.html寫入內容。

四、CMD

三種用法:

CMD ["executable","param1","param2"] #使用exec執行,推薦方式
CMD command param1 param2 #在/bin/sh中執行,提供給需要交互的應用
CMD ["param1","param2"] #提供給ENTRYPOINT的默認參數

CMD指令在Dockerfile中只能使用一次,如果存在多個,只有最後一個生效。
CMD是爲了在啓動容器的時候提供一個默認的命令執行選項。
CMD也可指定容器啓動時需要運行的程序。
如果在啓動容器的時候指定了運行命令,那麼該命令會覆蓋Dockerfile中的CMD指令。
例如:

CMD ['/bin/bash']

如果在啓動docker時輸入:

docker run -it ubuntu /bin/bash

那麼此時docker run中的/bin/bash會替代Dockerfile中/bin/bash生效。
即,啓動時可簡輸入:

docker run -it ubuntu

注:
CMD只有啓動容器的時候才執行,在build的時候不執行;
RUN只有構建鏡像的時候才執行,在run的時候不執行。

五、EXPOSE

用法:

EXPOSE <port> [<port>...]​#可配置多個端口號

告訴Docker服務端容器暴露的端口號,供互聯繫統使用。
在啓動時使用docker run -p才生效。

六、ENV

用法:

ENV <key> <value>    #設置一個變量
ENV <key>=<value>    #設置多個變量​

設置一個/多個環節變量,以供後續RUN指令(即在對基礎鏡像做操作時)使用,變量在容器運行時保留。
例如:

ENV NG nginx
ENV indexName index
RUN yum install -y $NG #引用NG變量
RUN echo 'hello world'>/$indexName.html   ​

七、ADD

用法:

ADD <src> ... <dest>​

ADD複製本地主機文件、目錄或者遠程文件urls到容器的指定路徑中。
例如:

ADD http://xxx.com/xxx.png /tmp/xxx.png ​

以上表示將xxx.png複製到容器的tmp目錄下。
ADD能自動解壓。

注:
如果源路徑的資源發生變化,則該ADD指令將使Docker Cache失效,Dockerfile中後續的所有指令都不能使用緩存;
因此儘量將ADD指令放在Dockerfile的最後。

八、COPY

用法:

COPY <src>... <dest>

COPY是複製文件或者目錄到容器指定位置。
與ADD的唯一區別是,COPY不能指定遠程文件urls。

九、ENTRYPOINT

兩種用法:

ENTRYPOINT ["executable", "param1", "param2"]
ENTRYPOINT command param1 param2 #(shell中執行)​

ENTRYPOINT指令效果與CMD類似,即都是在容器啓動時有效,指定一個程序在容器啓動時運行。
CMD與ENTRYPOINT最大的不同之處,就是在於用法上。
例如:

FROM centos
MAINTAINER eugene
RUN yum install -y nginx RUN echo 'hello world' > /usr/share/nginx/html/index.html
EXPOSE 80
ENTRYPOINT ["/usr/sbin/nginx"]​# 指定容器在啓動時運行nginx

注:
不可被docker run提供的參數覆蓋;
每個Dockerfile中只能有一個ENTRYPOINT,當指定多個時,只有最後一個起效。

十、USER

用法:

USER daemon​

指定容器運行時的用戶名或uid。

十一、WORKDIR

用法:

WORKDIR /path # 也可使用ENV設置的變量

爲後續的RUN、CMD、ENTRYPOINT指令配置工作目錄。

十二、ONBUILD

用法:

ONBUILD [instruction]

配置噹噹前所創建的鏡像作爲其它鏡像的基礎鏡像時,所要執行的指令。

例如:

ONBUILD ADD http://xxx.com/xxx.png /tmp/xxx.png  ​

即,當新的Dockerfile將以上鏡像作爲基礎鏡像時,會執行ADD指令。

十三、VOLUME

用法:

VOLUME ['/data']​

創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
- volume在容器創建時就初始化,在容器運行時就可以使用其中的文件

  • volume能在不同的容器之間共享和重用

  • 對volume中的數據的操作會馬上生效

  • 對volume中數據操作不會影響到鏡像本身

  • volume的生存週期獨立於容器的生存週期,即使刪除容器,volume仍然會存在,沒有任何容器使用的volume也不會被Docker刪除

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章