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 .
完