Docker系列三:Dockerfile

Dockerfile是由一系列命令和參數構成的腳本,這些命令應用於基礎鏡像並最終建立一個新的鏡像docker

Dockerfile由一行行命令語句組成,支持#開頭的註釋shell

Dockerfile分爲四部分:基礎鏡像信息,維護者信息,鏡像操做指令和容器啓動時執行命令centos

 

Dockerfile中的關鍵字bash

FROM

格式 FROM <image> 或 FROM <image>:<tag>app

第一條指令必須爲FROM指令,而且若是同一個Dockerfile中建立多個鏡像時,能夠使用多個FROM,每一個鏡像一次ssh

MAINTAINER

格式 MAINTAINER <name> 指定維護者信息ui

RUN

格式 RUN <command> 或 RUN ["executable", "param1", "param2"]url

前者使用shell終端執行命令,即/bin/sh -c; 後者使用exec執行命令;指定其餘終端使用第二種方式實現,例如 RUN ["/bin/bash" "-c", "echo hello"]spa

每條RUN指令將在當前鏡像基礎上面執行命令,並提交爲新的鏡像,當命令較長時能夠使用 \ 換行code

CMD

支持三種格式

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

CMD command param1 param2 在/bin/sh中執行,提供給須要交換的應用

CMD ["param1", "param2"] 提供給ENTRYPOINT的默認參數

指定容器時執行的命令,每一個Dockerfile只能有一條CMD命令,若是有多條,最後一條生效

若是用戶啓動容器指定了運行的命令,則CMD指令被覆蓋

EXPOSE

格式 EXPOSE <port> ... 容器暴露的端口號,當啓動容器時,若是指定了-P參數,則會隨機指定端口映射到暴露的端口上

ENV

格式 ENV <key> <value> 指定環境變量,能夠被後續的RUN指令使用

ADD

格式 ADD <src> <des> 該命令複製指定的src到容器中的des,啓動src能夠是一個相對路徑,能夠是一個url,也能夠是一個tar文件(會自動解壓爲目錄)

COPY

格式 COPY <src> <des> 複製本地文件到容器中,當本地文件時目錄時,推薦使用COPY

ENTRYPOINT

兩種格式

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

ENTRYPOINT command param1 param2 (shell中執行)

配置容器啓動後執行的命令,而且不可被docker run提供的參數覆蓋

每一個Dockerfile只有一個ENTRYPOINT,多條時最後一個生效

CMD和ENTRYPOINT的區別

若是同時有CMD和ENTRYPOINT指令,ENTRYPOINT指令級別高

若是Dockerfile中有CMD指令,則CMD指令的參數會附加到ENTRYPOINT指令的後面

若是docker run命令攜帶參數,這個參數會覆蓋掉CMD命令的參數,而且會附加到ENTRYPOINT這裏後面

ENTRYPOINT指令不會被docker run提供的指令覆蓋

VOLUME

格式 VOLUME ["/data1", "/data2"] 自動匿名掛載,自動生成掛載點---暫時不知道用途

USER

格式 USER daemon

指定容器運行時的用戶名或UID,後續的RUN也會使用指定用戶

WORKDIR

格式 WORKDIR /path/to/workdir

爲後續的RUN, CMD, ENTRYPOINT指令配置工做目錄

能夠使用多個WORKDIR指令,後續命令若是參數是相對路徑,則會基於以前命令指定的路徑

WORKDIR /a WORKDIR b WORKDIR c 最終路徑爲 /a/b/c

ONBUILD

格式 ONBUILD [INSTRUCTION]

配置當建立的鏡像做爲其餘新建立鏡像的基礎鏡像時,所執行的操做指令

該命令的意思爲:若是別的Dockerfile使用該文件建立的鏡像時,會自動執行ONBUIDL後面的命令

 

建立鏡像

目錄使用當前目錄查找,若是當前目錄爲空,則子目錄查找

若是工做目錄和Dockerfile是同一級, 使用./表示當前目錄下查找

 

建立文件 Dockerfile,能夠使用-f參數來指定使用的Dockerfile文件(默認配置文件名爲Dockerfile)

# Dockerfile文件, 同時本地鏡像中有一個鏡像名爲 centos:6.7, 基於該鏡像建立一個新建鏡像
# Dockerfile的原理是根據提供的鏡像建立一個容器,執行完指定的命令後,再從新打包出一個新的鏡像並刪除運行的容器
FROM centos:
6.7 MAINTAINER djoker EXPOSE 80 RUN yum -y install epel-release #RUN yum -y install supervisor openssh openssh-server openssh-clients RUN yum -y install supervisor run sed -i 's/nodaemon=false/nodaemon=true/' /etc/supervisord.conf CMD ["/usr/bin/supervisord"]

 

執行命令建立新的鏡像

# -f, --file string             Name of the Dockerfile (Default is 'PATH/Dockerfile')
# 後面是Dockerfile所在的目錄,  當工做目錄和Dockerfile在同一級時,使用./來表示從當前目錄查找,# 執行 docker build -t myrepo/myapp:laster ./
docker build -t myrepo/myapp /tmp/test1
相關文章
相關標籤/搜索