Dockerfile是一個文本格式的配置文件膝昆,用戶可以使用Dockerfile快速創(chuàng)建自定義的鏡像扇售。
基本結(jié)構(gòu)
Dockerfile由一行行命令語句組成改含,并且支持以#開頭的注釋行杆烁。
一般Dockerfile文件分為四部分:基礎(chǔ)鏡像信息灭忠、維護者信息、鏡像操作指令和容器啟動時執(zhí)行指令鸿摇。
# This dockerfile uses the ubuntu image
# VERSION 2 - EDITION 1
# Author:docker_user
# Command format: Instruction [arguments / command] ..
# 第一行必須制定基于的基礎(chǔ)鏡像
FROM ubuntu
# 維護者信息
MAINTAINER docker_user docker_user@email.com
# 鏡像的操作指令
RUN echo "deb http://archive.ubuntu.com/ubuntu/ raring main universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf
# 容器啟動時執(zhí)行指令
CMD /usr/sbin/nginx
Dockerfile文件編寫時石景,一開始必須指明所基于的鏡像名稱,接下來一般會說明維護者信息
后面則是鏡像操作指令拙吉,例如RUN指令潮孽,鏡像增加新的一層,并提交筷黔。最后是CMD指令往史,來指定運行容器時的操作命令。
以下有兩個摘自書上的Dockerfile例子:
# Ngnix
#
# VERSION 0.0.1
FROM ubuntu
MAINTAINER Victor Vieux <victor@docker.com>
RUN apt-get update && apt-get install -y inotify-tools nginx apache2 openssh-server
此Dockerfile文件是在ubuntu父鏡像基礎(chǔ)上安裝inotify-tools佛舱、nginx椎例、apache2、openssh-server軟件请祖,從而創(chuàng)建一個新的Nginx鏡像
注 :inotify-tools是為linux下inotify文件監(jiān)控工具提供的一套c的開發(fā)接口庫函數(shù)订歪,同時還提供了一系列的命令行工具,這些工具可以用來監(jiān)控文件系統(tǒng)的事件肆捕。
# Firefox over VNC
#
# VERSION 0.3
FROM ubuntu
# Install vnc, xvfb in order to reate a 'fake' display and firefox
RUN apt-get update && apt-get install -y xllvnc xvfb firefox
RUN mkdir /.vnc
# Setup a password
RUN xllvnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way, but it does the trick)
RUN bash -c 'echo "firefox" >> /.bashrc'
EXPOSE 5900
CMD ["xllvnc", "-forever", "-usepw", "-create"]
此Dockerfile基于ubuntu父鏡像刷晋,安裝filefox和vnc軟件,啟動后慎陵,用戶可以通過5900端口通過vnc方式使用firefox眼虱。
指令
指令的一般格式為INSTRUCTION arguments,指令包括FROM席纽、MAINTAINER捏悬、RUN等。
Dockerfile指令說明
指令 | 說明 |
---|---|
FROM | 指定所創(chuàng)建鏡像的基礎(chǔ)鏡像 |
MAINTAINER | 指定維護者信息 |
RUN | 運行命令 |
CMD | 指定啟動容器時默認執(zhí)行的命令 |
LABEL | 指定生成鏡像的元數(shù)據(jù)標簽信息 |
EXPOSE | 聲明鏡像內(nèi)服務(wù)所監(jiān)聽的端口 |
ENV | 指定容器環(huán)境變量 |
ADD | 復(fù)制指定的 <src> 路徑下的內(nèi)容到容器中的 <dest> 路徑下润梯,<src> 可以為URL过牙;如果為tar文件,會自動解壓到 <dest> 路徑下 |
COPY | 復(fù)制本地主機的 <src> 路徑下的內(nèi)容到鏡像中的 <dest> 路徑下纺铭;一般情況下推薦使用COPY而不是ADD |
ENTRYPOINT | 指定鏡像的默認入口 |
VOLUME | 創(chuàng)建數(shù)據(jù)卷掛載點 |
USER | 指定運行容器時的用戶名或UID |
WORKDIR | 配置工作目錄 |
ARG | 指定鏡像內(nèi)使用的參數(shù) (例如版本號信息等) |
ONBUILD | 配置當所創(chuàng)建的鏡像作為其他鏡像的基礎(chǔ)鏡像時抒和,所執(zhí)行的創(chuàng)建操作指令 |
STOPSIGNAL | 容器退出的信號值 |
HEALTHCHECK | 如何進行健康檢查 |
SHELL | 指定使用shell時的默認shell類型 |
FROM
格式為 FROM <image> 或FROM<image>:<tag>
第一條指令必須為FROM指令。并且彤蔽,如果在同一個Dockerfile中創(chuàng)建多個鏡像時摧莽,可以使用多個FROM指令(每個鏡像一次)。
MAINTAINER
格式為 MAINTAINER <name>, 指定維護者信息
RUN
格式為 RUN <command> 或 RUN ["executable", "param1", "param2"]
RUN <command> 將在shell終端中運行命令顿痪,即 /bin/sh -c
RUN ["executable", "param1", "param2"]則使用exec執(zhí)行镊辕。
指定使用其他終端可以通過第二種方式實現(xiàn)油够,例如 RUN ["/bin/bash", "-c", "echo hello"]。
每條RUN指令將在當前鏡像基礎(chǔ)上執(zhí)行指令命令征懈,并提交為新的鏡像石咬。當命令較長時可以用 \ 來換行。
CMD
支持三種格式
-
使用exec執(zhí)行卖哎,推薦方式
CMD ["executable", "param1", "param2"]
-
在/bin/sh中執(zhí)行鬼悠,提供給需要交互的應(yīng)用
CMD command param1 param2
-
提供給ENTRYPOINT的默認參數(shù)
CMD ["param1", "param2"]
指定啟動容器時執(zhí)行的命令,每個Dockerfile只能有一條CMD命令亏娜。如果指定了多條命令焕窝,只有最后一條會被執(zhí)行。
如果用戶啟動容器時指定了運行的命令维贺,則會覆蓋掉CMD指定的命令它掂。
EXPOSE
格式為 EXPOSE <port> [<port>...]
例如:EXPOSE 22 80 8443
就是告訴Docker服務(wù)器容器暴露的端口號,供互聯(lián)系統(tǒng)使用溯泣。在啟動容器時需要通過-P或者-p來指定端口映射虐秋。
ENV
格式為 ENV <key> <value>
指定一個環(huán)境變量,會被后續(xù)RUN指令使用垃沦,并在容器運行時保持客给。例如:
ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
RUN curl -SL http://example.com/postgres-$PG_VERSION.tar.xz | tar -xJC /usr/src/postgress && ...
ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH
ADD
格式為 ADD <src> <dest>
該命令將復(fù)制指定的<src>到容器中的<dest>。其中<src>可以是Dockerfile所在目錄的一個相對路徑(文件或目錄)肢簿;也可以是一個URL起愈;還可以是一個tar文件(自動解壓為目錄)。
COPY
格式為 COPY <src> <dest>
復(fù)制本地主機的<src>(為Dockerfile所在目錄的相對路徑译仗,文件或目錄)為容器中的<dest>。目標路徑不存在時官觅,會自動創(chuàng)建纵菌。
當使用本地目錄為源目錄時,推薦使用COPY
ENTRYPOINT
-
使用exec執(zhí)行休涤,推薦方式
ENTRYPOINT ["executable", "param1", "param2"]
-
在shell中執(zhí)行
ENTRYPOINT command param1 param2
配置容器啟動后執(zhí)行的命令咱圆,并且不可被docker run提供的參數(shù)覆蓋
每個Dockerfile中只能有一個ENTRYPOINT,當制定多個ENTRYPOINT時功氨,只有最后一個生效序苏。
VOLUME
格式為 VOLUME ["/data"]
創(chuàng)建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數(shù)據(jù)庫和需要保持的數(shù)據(jù)等捷凄。
USER
格式為 USER daemon
指定運行容器時的用戶名或UID忱详,后續(xù)的RUN也會使用指定的用戶。
當服務(wù)不需要管理員權(quán)限時跺涤,可以通過該命令指定運行用戶匈睁。并且可以在之前創(chuàng)建所需要的用戶监透,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres
要臨時獲取管理員權(quán)限可以使用gosu,不推薦sudo
WORKDIR
格式為 WORKDIR /path/to/workdir
為后續(xù)RUN航唆、CMD胀蛮、ENTRYPOINT指令配置工作目錄。
可以使用多個WORKDIR指令糯钙,后續(xù)命令如果參數(shù)是相對路徑粪狼,則會基于之前命令指定的路徑。例如:
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
上面指令最終結(jié)果為:/a/b/c
ONBUILD
格式為 ONBUILD [INSTRUCTION]
配置當所創(chuàng)建的鏡像作為其他新創(chuàng)建鏡像的基礎(chǔ)鏡像時任岸,所執(zhí)行的操作指令再榄。例如:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
Dockerfile使用上面的內(nèi)容創(chuàng)建了鏡像image-A,如果基于image-A創(chuàng)建新的鏡像時演闭,新的Dockerfile中使用FROM image-A指定基礎(chǔ)鏡像時不跟,會自動執(zhí)行ONBUILD指令內(nèi)容,等價于在Dockerfile后面添加了兩條指令米碰,如:
FROM image-A
# Automatically run the following
ADD . /app/src
RUN /usr/local/bin/python-build --dir /app/src
使用ONBUILD指令的鏡像窝革,推薦在標簽中注明,例如ruby:1.9-onbuild吕座。
關(guān)注我的微信公眾號:FramePower
我會不定期發(fā)布相關(guān)技術(shù)積累虐译,歡迎對技術(shù)有追求、志同道合的朋友加入吴趴,一起學(xué)習成長漆诽!