Dockerfile創建鏡像模板詳解

Dockerfile是一個文本格式的配置文件,用戶可以使用Dockfile快速創建自定義的鏡像。
Dockerfile是由一行行的命令語句組成,並且支持以#開頭的註釋行。
#一般而言,Dockerfile分爲四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動是執行的指令。
模板如下:

#This dockerfile uses the ubuntu image
#指定基於的基礎鏡像,可以使用多個FROM指令,如果在同一個Dockerfile中創建多個鏡像時,可以使用多個FROM指令(每個鏡像一次)
#FROM <image>或FROM <image>:<tag>

#MAINTAINER 指定維護者信息
#MAINTAINER UserName <[email protected]>

#ENV 指定一個環境變量,會被後續RUN指令使用,並在容器運行時保持。
#ENV <key> <value>
ENV DEBIAN_FRONTEND noninteractive(設置環境變量,所有操作都是非交互式的)

#RUN 鏡像的操作指令
#格式爲RUN <command>或RUN ["executable","param1","param2"],前者將在shell終端中運行命令,即/bin/sh -c;後者則可使用exec執行。每條RUN指令將會在當前鏡像基礎上執行指定命令,並提交爲新的鏡像。當命令較長時,可以使用\來換行。

#複製本地主機的<src>(爲Docker所在目錄的相對路徑,文件或目錄)爲容器中的<dest>。目標路徑不存在是,會自動創建。當使用本地目錄爲源目錄是,推薦使用COPY。
#COPY <src> <dest>

#ENTRYPOINT,有兩種格式
#1.ENTRYPOINT ["executable","param1","param2"]
#2.ENTRYPOINT command param1 param2(shell中執行)
#每個Dockerfile只能有一個ENTRYPOINT,當指定多個時,如果指定多個ENTRYPOINT,只有最後一個生效。配置容器啓動後執行的命令,並且不可被docker run提>供的參數覆蓋。

#EXPOSE 告訴Docker服務端容器暴露的端口號,供互聯繫統使用。
#EXPOSE <port> [<port>...]

#複製指定的<src>到容器中的<dest>,其中<src>可以使Dockerfile所在目錄的一個相對路徑(文件或目錄);也可以是一個URL;還可以是一個tar文件(自動解壓爲目錄)。
#ADD <src> <dest>
1.如果源路徑是個文件,且目標路徑是以 / 結尾, 則docker會把目標路徑當作一個目錄,會把源文件拷貝到該目錄下。如果目標路徑不存在,則會自動創建目標路徑。
2.如果源路徑是個文件,且目標路徑是不是以 / 結尾,則docker會把目標路徑當作一個文件。如果目標路徑不存在,會以目標路徑爲名創建一個文件,內容同源文件。
如果目標文件是個存在的文件,會用源文件覆蓋它,當然只是內容覆蓋,文件名還是目標文件名。
如果目標文件實際是個存在的目錄,則會源文件拷貝到該目錄下。 注意,這種情況下,最好顯示的以 / 結尾,以避免混淆。
3.如果源路徑是個目錄,且目標路徑不存在,則docker會自動以目標路徑創建一個目錄,把源路徑目錄下的文件拷貝進來。
如果目標路徑是個已經存在的目錄,則docker會把源路徑目錄下的文件拷貝到該目錄下。
4.如果源文件是個歸檔文件(壓縮文件),則docker會自動幫解壓。

#VOLUME 創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
#VOLUME ["/data"]

#USER指定運行容器時的用戶名或UID,後續的RUN也會使用指定用戶。要臨時獲取管理員權限的時候要使用gosu,不推薦使用sudo。如果不指定,容器默認是root運行。
#USER daemon

#WORKDIR 爲後續的RUN\CMD\ENTRYPOINT指令配置工作目錄,可以使用多個WORKDIR指令,後續命令如果參數是相對路徑,則會基於之前命令指定的路徑。
#WORKDIR /path/to/workdir
#例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
#則最終路徑爲/a/b/c

#ONBUILD 配置爲所創建的鏡像作爲其他新創建鏡像的基礎鏡像時,所執行的操作指令。使用ONBUILD指令的鏡像,推薦在標籤中註明,例如:nginx:1.9.11-onbuild。
#ONBUILD [INSTRUCTION]

#CMD 容器啓動時執行指令,支持三種格式
#1.CMD ["executable","param1","param2"]
#2.CMD command param1 param2在/bin/sh中執行,提供給需要交互的應用
#3.CMD ["param1","param2"]提供給ENTRYPOINT的默認參數
#如果指定多條,只有最後一條會被執行,如果用戶啓動容器時指定了運行的命令,則會覆蓋掉CMD指定的命令。

舉個例子:
vi Dockerfile
#This dockerfile uses the pagekit
FROM ubuntu:trusty
MAINTAINER UserName<[email protected]>
RUN apt-get update && \
apt-get -y install nginx unzip wget ca-certificates \
php5 php5-fpm php5-cli php5-json php5-mysql php5-curl
ENV PAGEKIT_VERSION 1.0.2
RUN mkdir pagekit
WORKDIR /pagekit
VOLUME ["/pagekit/storage", "/pagekit/app/cache"]
RUN wget https://github.com/pagekit/pagekit/releases/download/$PAGEKIT_VERSION/pagekit-$PAGEKIT_VERSION.zip -O /pagekit/pagekit.zip && \
unzip /pagekit/pagekit.zip && rm /pagekit/pagekit.zip
COPY nginx.conf /etc/nginx/nginx.conf
RUN chown -R wwwdata: /pagekit && \
apt-get autoremove wget unzip -y && \
apt-get autoclean -y && \
apt-get clean -y && \
rm -rf /varf/lib/apt/list/ /tmp/ /var/tmp/*
CMD ["sh","-c","service php5-fpm start && nginx"]

更多Dockerfile實例請看我的另一篇博客 http://blog.51cto.com/12943999/2087906

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