1. 程式人生 > >Docker實踐(四)Dockerfile

Docker實踐(四)Dockerfile

什麼是Dockerfile?

使用Dockerfile,可以方便的建立自定義映象。

基本結構

由一行行命令組成,支援#註釋。Dockerfile一般分為四個部分:

  • 基礎映象資訊
  • 維護者資訊
  • 映象操作指令
  • 容器啟動指令

如下面是一個基礎的Dockerfile

#dockerfile 使用centos作為基礎映象,基礎映象必須在第一行設定
FROM centos:7.2.1511
#維護人員,< weiha322 at 163.com>
MAINTAINER weihao322 [email protected]@163.com
#更新映象的命令 安裝nginx
RUN yum -y install nginx
#建立一個新容器的命令
CMD /usr/sbin/nginx

開始的第一行就應該先指定容器的基礎映象。接下來一般是說明維護者資訊,後面是映象的操作命令,對基礎映象進行改造,最後指定容器執行時的執行命令,即CMD命令

指令

指令的一般格式是INSTRUCTION arguments,指令包括FROM,MAINTAINER,RUN,CMD等,下面一一介紹。

FROM

一般格式是FROM <image>或者FROM <image>:<tag>,為容器指定基礎映象,Dockerfile的第一條指令必須是FROM指令,如果一個Dockerfile建立多個容器的話,可以使用多個FROM指令(每個映象一次)

MAINTAINER

格式為 MAINTAINER <name>,指定Dockerfile的維護者資訊

RUN

格式為 RUN <command>或RUN ["executable", "param1", "param2"],前者是在shell終端中執行命令,即/bin/sh -c;後者使用exec執行命令,指定使用其他終端可以通過第二種方式實現,如:RUN ["/bin/bash", "-c", "echo helloworld"]

每天RUN指令都是在基礎映象上執行指定命令並提交為新的命令,如果命令比較長時,使用\換行。

CMD

支援三種格式

CMD ["executable", "param1", "param2"]使用exec執行,推薦方式。

CMD command param1 param2在/bin/sh中執行,提供給需要互動的應用

CMD ["param1", "param2"]提供給ENTRYPOINT的預設引數

指定啟動容器時執行的命令,每個Dockerfile只有一條CMD命令,如果一個容器制定了多條CMD命令,只有最後一條CMD命令會被執行。

如果使用者啟動容器是指定了執行的命令,會覆蓋掉CMD指定命令。

EXPOSE

格式為 EXPOSE <port> [<port>…]。

告訴Docker服務端容器暴露的埠號,供互聯絡使用。在容器啟動時需要通過-P,Docker主機會自動分配一個埠轉發到指定的埠

ENV

格式為ENV <key> <value>。指定一個環境變數,會被後續RUN指令使用,並在容器執行時保持。

如:

 ENV VERSION 7.2.1511
 RUN wget http://www.weihao.com/download/a.$VERSION.tar.gz
 ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH

ADD

格式為ADD <src> <dist>

ADD命令複製指定的src到容器中的dist目錄,其中src可以是Dockerfile所在目錄的一個相對路徑,也可以是一個URL,也可以是一個tar檔案,自動解壓為目錄

COPY

格式為 COPY <src> <dist>

複製本地主機的src目錄(Dockerfile所在目錄的相對路徑)到容器中的dist目錄

當時用本地目錄為源目錄時,推薦使用COPY

ENTRYPOINT

格式有兩種

ENTRYPOINT ["executable", "param1" ,"param2"]

ENTRYPOINT command param1 param2 (在shell中執行)

配置容器啟動後執行的命令,並且不可為docker run提供的引數覆蓋,每個Dockerfile中只有一個ENTRYPOINT,當指定多個ENTRYPOINT時,最後一個生效

VOLUME

格式為 VOLUME ["/data"]

建立一個可以從本地主機或其他容器掛載的掛載點,一般用來存放資料庫,和需要保持的資料。

USER

格式為USER daemon

指定容器執行時的使用者名稱或者UID,後續的RUN也會使用指定使用者

當服務不需要管理員許可權時,可以通過該命令指定執行使用者,並且可以在之前建立所需要的使用者,例如:RUN groupadd -r mysql && useradd -r -g mysql mysql,需要臨時獲取管理員許可權,可以通過gosu,不推薦使用sudo。

WORKDIR

格式為 WORKDIR /path/to/workdir

為後續的RUN,CMD,ENTRYPOINT指令配置工作目錄

可以使用多個WORKDIR命令,後續命令引數如果是相對路徑,則會基於之前的命令指定目錄

WORKDIR /a

WORKDIR b

WORKDIR c

ONBUILD

格式為 ONBUILD [instruction]

配置當前所建立的映象作為其他映象的基礎映象時,所執行的操作命令,如imageA包含ONBUILD命令如下:

[…]

ONBUILD ADD . /app/src

ONBUILD RUN /usr/local/bin/python-build --dir /app/src

[…]

如果基於imageA建立imageB時,在新的Dockerfile中使用FROM imageA指定基礎映象時,就會自動執行ONBUILD命令的內容。等價於在imageB的Dockerfile後面新增兩條命令。如下:

FROM imageA

#自動執行

ADD . /app/src

RUN /usr/local/bin/python-build --dir /app/src

使用ONBUILD指令的映象,推薦在標籤中註明,如:ruby:1.9-onbuild

建立映象

編寫完成Dockerfile後,可以使用docker build命令來建立映象。命令基本格式為docker build [選項] [路徑]。

這個命令讀取指定目錄下的Dockerfile檔案,並將路徑下的所有內容傳送給docker,由docker來建立映象,因此指定目錄下一般不要有其他不相關的檔案,docker提供了.dockerignore機制來讓提交到docker時忽略掉某些檔案,.dockerignore檔案每一行新增一個匹配格式。

要指定映象的標籤資訊,可以通過-t命令來指定,如:

docker build -t myapp .