Docker:DockerFile詳解與實例


基本結構

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

指定啟動容器時執行的命令,每個 Dockerfile 只能有一條 CMD 命令。如果指定了多條 CMD 命令,只有最后一條會被執行。如果用戶在啟動容器時指定了要運行的命令,則會覆蓋掉 CMD 指定的命令。
CMD echo "------success------OK------"

EXPOSE

告訴 Docker 服務,容器需要暴露的端口號,供互聯系統使用。在啟動容器時需要通過 -P 參數讓 Docker 主機分配一個端口轉發到指定的端口。使用 -p 參數則可以具體指定主機上哪個端口映射過來。
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

該命令將復制指定的 <src> 到容器中的 <dest>。其中 <src> 可以是 Dockerfile 所在目錄的一個相對路徑(文件或目錄);也可以是一個 URL;還可以是一個 tar 文件(自動解壓為目錄)。
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

 

文章轉載至:https://www.jianshu.com/p/a701de415be5


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM