一、dockerfile基本結構
最簡單的理解就是dockerfile實際上是一些命令的堆疊,有點像最基礎的shell腳本,沒有if 沒有for,就是串行的一堆命令。
一般而言,dockerfile分為四個部分:基礎鏡像信息、維護者信息、鏡像操作指令和啟動時執行指令,例如:
#基礎鏡像信息 FROM ubuntu #維護者信息 MAINTAINER slim_liu slim_liu@163.com #鏡像操作指令 RUN apt-get update && apt-get install -u nginx #啟動容器時執行的指令 CMD /usr/sbin/nginx
二、鏡像操作指令
指令分為很多種,下面一一列舉:
指令一般格式為 INSTRUCTION arguments ,指令包括FROM、MAINTAINER、RUN 等。
2.1 FROM
格式:
FROM <image>或FROM <image>:<tag>
Dockerfile 的開頭,必須是FROM,如果在同一個dockerfile中創建多個鏡像,可以使用多個from,每個鏡像一次。
2.2 MAINTAINER
格式:
MANINTAINER <name>,指定維護者信息
2.3 RUN
格式:
RUN <command>或RUN ["executable", "param1", "param2"]
前者將在shell終端中執行命令,即 /bin/sh -c。后者則使用exec執行,指定終端,可以使用第二種,RUN ["/bin/bash", "-c" , "echo hello!"]
2.4 CMD
CMD支持三種格式:
CMD ["executable", "param1", "param2"]#使用exec執行,推薦方式。
CMD command param1 param2 #在/bin/sh 中執行,提供給需要交互的應用。
CMD ["param1", "param2"] #提供給ENTRYPOINT 的默認參數。
每個dockerfile只能指定一條CMD指令,如果有多條,則只會執行最后一條,並且如果啟動容器時,指定了運行的命令,則會覆蓋掉CMD指定的命令。
2.5 EXPOSE
格式:
EXPOSE <port> <port> ...
例:
EXPOSE 80 443 3306
告訴docker容器暴露的端口號,供互聯系統使用。在啟動容器時,需要通過-P,docker主機會自動分配一個端口轉發到指定的端口,如果使用-p,則可以具體的指定端口映射關系。
2.6 ENV
格式:
ENV <key> <value> #指定一個環境變量,會被后續的RUN變量使用,並且會在容器中保持。 例: ENV A 1 RUN curl -SL http://test.com/temp-$A.tar.gz
2.7 ADD
格式:
ADD <src> <dest>
復制指定的src到容器中的dest,src可以是dockerfile相對路徑的目錄、url、tar文件(將自動解壓成目錄)等
2.8 COPY
格式:
COPY <src> <dest>
復制本地主機的src(為dockerfile所在目錄的相對路徑,文件或目錄)為容器中的dest,目標路徑不存在時,會自動創建,當使用本地目錄為源目錄時,推薦使用COPY。
2.9 ENTRYPOINT
格式1:
ENTRYPOINT ["executable", "param1", "param2"]
格式2:
ENTRYPOINT command param1 param2 (#shell中執行)
配置容器啟動時執行的命令,並且不能被docker run 提供的參數覆蓋。
每個dockerfile只能有一個此參數,多個時候,只有最后一個生效。
2.10 VOLUME
格式:
VOLUME <"/data">
創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。
2.11 USER
格式:
USER daemon
指定運行容器時的用戶名或UID,后續的RUN命令也會使用指定用戶。
當容器不需要管理員權限時,建議添加USER參數,例如:
RUN groupadd -r postgres && useradd -r -g postgres postgres #需要臨時獲取管理員權限,可以使用gosu,不推薦sudo。
2.12 WORKERDIR
格式:
WORKERDIR /path/workerdir
為后續的RUN CMD ENTRYPOINT等指令配置工作目錄。
可以使用多個WORKERDIR,如果后續的參數是相對路徑,將基於之前的WORKERDIR
例:
WORKERDIR /a
WORKERDIR b
WORKERDIR c
RUN pwd
/a/b/c
2.13 ONBUILD
格式:
ONBUILD [INSTRUCTION]
配置當所創建的鏡像作為其他新創建鏡像的基礎鏡像時,所執行的操作指令。
例:
我們首先創建了image-a,並在其中使用了ONBUILD
[...] ONBUILD ADD . /src/ ONBUILD RUN /usr/local/bin/python-build --dir /app/src [...]
接着我們from image-a創建image-b,就會自動執行上面的兩句。
如果使用ONBUILD指令的鏡像,推薦在標簽中注明,例如,ruby:1.9-onbuild