基本結構
Dockerfile 由一行行命令語句組成,並且支持已 # 開頭的注釋行。
一般而言,Dockerfile 的內容分為四個部分:
基礎鏡像信息、
維護者信息、
鏡像操作指令、
容器啟動時執行指令、
Dockerfile完整demo
# This dockerfile demo for project build to docker images # VERSION 2 # Author: Shawn_xiao # Command format: Instruction [arguments / command] … # 2018/10/10- firstversion: xiao # 2018/10/11- chanege the tomcat version # 第一行必須指定基礎容器,建議使用aipln類型的小容器 FROM tomcat:8 # 維護者信息(可選) MAINTAINER xiaojianjun xiaojianjun@tansun.com.cn # LABEL (可選) 標簽信息(自定義信息,多標簽放一行) LABEL app.maintainer=xiaojianjun LABEL app.version="1.0" app.host='bestxiao.cn' description="這個app產品構建" # ENV (可選)環境變量(指定一個環境變量,會被后續 RUN 指令使用,並在容器運行時保持 ENV JAVA_HOME /opt/java_jdk/bin ENV PG_VERSION 9.3.4 ENV PATH /usr/local/postgres-$PG_MAJOR/bin:$PATH # USER (可選) 指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶,前面的RUN 不受影響 # RUN groupadd -r postgres && useradd -r -g postgres postgres USER postgres # WORKDIT 后續的 RUN、CMD、ENTRYPOINT 指令配置容器內的工作目錄 WORKDIR /path/to/workdir # ADD/COPY 將外部文件copy到容器中。區別是ADD可以使用URL,還可以是tar # COPY只能使用dockerfile所在目錄 # ADD <src> <dest> # COPY <src> <dest> COPY target/tomcat-release.war /usr/local/tomcat/webapps/ # RUN 鏡像的操作指令 # RUN <command> [“executable”, “param1”, “param2”]。 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 mkdir /opt/deploy/ RUN echo “\ndaemon off;” >> /etc/nginx/nginx.conf # EXPOSE 容器啟動后需要暴露的端口 EXPOSE 22 80 8443 8080 # VOLUME 本地或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。 #VOLUME ["/data"] VOLUME ["/data/postgres", "/other/path/"] # ENTRYPOINT 容器啟動后執行命令,不會被docker run提供的參數覆蓋,只能有一個ENTRYPOINT, # 多個ENTRYPOINT,以最后一個為准 #ENTRYPOINT [“executable”, “param1”, “param2”] #ENTRYPOINT command param param2 ENTRYPOINT echo "helloDocker" # 容器啟動時執行指令,每個 Dockerfile 只能有一條 CMD 命令 #CMD [“executable”, “param1”, “param2”] 使用 exec 執行,推薦方式。 #CMD command param1 param2 在 /bin/sh 中執行,提供給需要交互的應用。 #CMD [“param1”, “param2”] 提供給 ENTRYPOINT 的默認參數。 CMD /usr/sbin/nginx # ONBUILD 配置當所創建的鏡像作為其他新創建鏡像的基礎鏡像時,所執行的操作指令。例如,Dockerfile 使用如下的內容創建了鏡像 image-A。-- 很少使用 # ONBUILD ADD . /app/src # ONBUILD RUN /usr/local/bin/python-build –dir /app/src
簡短demo
FROM centos LABEL version="1.0" description="centos7" by="測試" ENV MYPATH /usr/local WORKDIR $MYPATH RUN yum -y install java-1.8.0-openjdk
#設置容器時間與宿主機時間同步 RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone EXPOSE 80 CMD echo "------success------OK------"
#指定鏡像 FROM primetoninc/jdk:1.8 #拷貝宿主機的app.jar COPY app.jar app.jar #配置端口 EXPOSE 8080 #運行app.jar包 ENTRYPOINT exec java -jar app.jar
Dockerfile關鍵指令說明:
FROM
格式為 FROM <image> 或 FROM<image>:<tag>。
Dockerfile 的第一條指令必須為 FROM 指令。並且,如果在同一個 Dockerfile 中創建多個鏡像時,可以使用多個 FROM 指令。
# 第一行必須指定基礎容器,這里的是tomcat8 FROM tomcat:8
MAINTAINER
格式為 MAINTAINER <name>,指定維護者信息。
注意:MAINTAINER 指令已經被拋棄,建議使用 LABEL 指令。
# 維護者信息(可選)建議用LABEL 指令
MAINTAINER xiaojianjun xiaojianjun@tansun.com.cn
LABEL
LABEL 指令為鏡像添加標簽。一個 LABEL 就是一個鍵值對,也可以一行指定多個鍵值對。
#多行指定信息 LABEL com.example.label-with-value="foo" LABEL version="1.0" LABEL description="This text illustrates \that label-values can span multiple lines." #一行指定多個鍵值對 LABEL app.version="1.0" app.host='bestxiao.cn' description="這個app產品構建"
如果新添加的 LABEL 和已有的 LABEL 同名,則新值會覆蓋掉舊值。
RUN
每條 RUN 指令將在當前鏡像的基礎上執行指定命令,並提交為新的鏡像。當命令較長時可以使用 \ 來換行。
RUN yum -y install java-1.8.0-openjdk
CMD
CMD echo "------success------OK------"
EXPOSE
EXPOSE 22 80 8443 8080
ENV
格式為 ENV <key> <value>。指定一個環境變量,會被后續 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>
COPY
復制本地主機的 <src> (為 Dockerfile 所在目錄的相對路徑,文件或目錄) 為容器中的 <dest>。目標路徑不存在時,會自動創建。當使用本地目錄為源目錄時,推薦使用 COPY。
COPY <src> <dest>
ENTRYPOINT
配置容器啟動后執行的命令,並且不可被 docker run 提供的參數覆蓋。每個 Dockerfile 中只能有一個 ENTRYPOINT,當指定多個 ENTRYPOINT 時,只有最后一個生效。
ENTRYPOINT [“executable”, “param1”, “param2”]
ENTRYPOINT command param1 param2 (shell 中執行)
VOLUME
使用 VOLUME 指令添加多個數據卷,創建一個可以從本地或其他容器掛載的掛載點,一般用來存放數據庫和需要保持的數據等。VOLUME ["/data"] VOLUME ["/data1", "/data2"]
USER
指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶。當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶
USER daemon
或
RUN groupadd -r postgres && useradd -r -g postgres postgres
WORKDIR
為后續的 RUN、CMD、ENTRYPOINT 指令配置工作目錄。可以使用多個 WORKDIR 指令,后續命令如果參數是相對路徑,則會基於之前命令指定的路徑。
# WORKDIT 后續的 RUN、CMD、ENTRYPOINT 指令配置容器內的工作目錄
WORKDIR /path/to/workdir
ONBUILD
配置當所創建的鏡像作為其他新創建鏡像的基礎鏡像時,所執行的操作指令FROM image-A#automatically run the followingADD ONBUILD ADD . /app/srcONBUILD RUN /usr/local/bin/python-build –dir /app/src
如果基於 image-A 創建新的鏡像時,新的 Dockerfile 中使用 FROM image-A 指定基礎鏡像時,會自動執行 ONBUILD 指令內容,等價於在后面添加了兩條指令。
FROM image-A#automatically run the followingADD . /app/srcRUN /usr/local/bin/python-build –dir /app/src