docker學習(3)--Dockfile詳解
轉載請註明出處:http://www.cnblogs.com/lighten/p/6900556.html
1.基本說明
Dockfile是一個用於編寫docker鏡像生成過程的文件,其有特定的語法。在一個文件夾中,如果有一個名字為Dockfile的文件,其內容滿足語法要求,在這個文件夾路徑下執行命令:docker build --tag name:tag .,就可以按照描述構建一個鏡像了。name是鏡像的名稱,tag是鏡像的版本或者是標簽號,不寫就是lastest。註意後面有一個空格和點。
2.Dockfile語法
Dockerfile的基本指令有十三個,分別是:FROM、MAINTAINER、RUN、CMD、EXPOSE、ENV、ADD、COPY、ENTRYPOINT、VOLUME、USER、WORKDIR、ONBUILD。下面對這些指令的用法一一說明。
2.1 FROM
用法:FROM <image>
說明:第一個指令必須是FROM了,其指定一個構建鏡像的基礎源鏡像,如果本地沒有就會從公共庫中拉取,沒有指定鏡像的標簽會使用默認的latest標簽,可以出現多次,如果需要在一個Dockerfile中構建多個鏡像。
2.2 MAINTAINER
用法:MAINTAINER <name> <email>
說明:描述鏡像的創建者,名稱和郵箱
2.3 RUN
用法:RUN "command" "param1" "param2"
說明:RUN命令是一個常用的命令,執行完成之後會成為一個新的鏡像,這裏也是指鏡像的分層構建。一句RUN就是一層,也相當於一個版本。這就是之前說的緩存的原理。我們知道docker是鏡像層是只讀的,所以你如果第一句安裝了軟件,用完在後面一句刪除是不可能的。所以這種情況要在一句RUN命令中完成,可以通過&符號連接多個RUN語句。RUN後面的必須是雙引號不能是單引號(沒引號貌似也不要緊),command是不會調用shell的,所以也不會繼承相應變量,要查看輸入RUN "sh" "-c" "echo" "$HOME",而不是RUN "echo" "$HOME"。
2.4 CMD
用法:CMD command param1 param2
說明:CMD在Dockerfile中只能出現一次,有多個,只有最後一個會有效。其作用是在啟動容器的時候提供一個默認的命令項。如果用戶執行docker run的時候提供了命令項,就會覆蓋掉這個命令。沒提供就會使用構建時的命令。
2.5 EXPOSE
用法:EXPOSE <port> [<port>...]
說明:告訴Docker服務器容器對外映射的容器端口號,在docker run -p的時候生效。
2.6 ENV
用法:EVN <key> <value> 只能設置一個
EVN <key>=<value>允許一次設置多個
說明:設置容器的環境變量,可以讓其後面的RUN命令使用,容器運行的時候這個變量也會保留。
2.7 ADD
用法:ADD <src> <dest>
說明:復制本機文件或目錄或遠程文件,添加到指定的容器目錄,支持GO的正則模糊匹配。路徑是絕對路徑,不存在會自動創建。如果源是一個目錄,只會復制目錄下的內容,目錄本身不會復制。ADD命令會將復制的壓縮文件夾自動解壓,這也是與COPY命令最大的不同。
2.8 COPY
用法:COPY <src> <dest>
說明:COPY除了不能自動解壓,也不能復制網絡文件。其它功能和ADD相同。
2.9 ENTRYPOINT
用法:ENTRYPOINT "command" "param1" "param2"
說明:這個命令和CMD命令一樣,唯一的區別是不能被docker run命令的執行命令覆蓋,如果要覆蓋需要帶上選項--entrypoint,如果有多個選項,只有最後一個會生效。
2.10 VOLUME
用法:VOLUME ["path"]
說明:在主機上創建一個掛載,掛載到容器的指定路徑。docker run -v命令也能完成這個操作,而且更強大。這個命令不能指定主機的需要掛載到容器的文件夾路徑。但docker run -v可以,而且其還可以掛載數據容器。
2.11 USER
用法:USER daemon
說明:指定運行容器時的用戶名或UID,後續的RUN、CMD、ENTRYPOINT也會使用指定的用戶運行命令。
2.12 WORKDIR
用法:WORKDIR path
說明:為RUN、CMD、ENTRYPOINT指令配置工作目錄。可以使用多個WORKDIR指令,後續參數如果是相對路徑,則會基於之前的命令指定的路徑。如:WORKDIR /home WORKDIR test 。最終的路徑就是/home/test。path路徑也可以是環境變量,比如有環境變量HOME=/home,WORKDIR $HOME/test也就是/home/test。
2.13 ONBUILD
用法:ONBUILD [INSTRUCTION]
說明:配置當前所創建的鏡像作為其它新創建鏡像的基礎鏡像時,所執行的操作指令。意思就是,這個鏡像創建後,如果其它鏡像以這個鏡像為基礎,會先執行這個鏡像的ONBUILD命令。
3.Dockerfile例子
一個使用安裝包安裝的tomcat例子:
FROM centos MAINTAINER nobody "[email protected]" RUN mkdir -p /opt/jdk/ RUN mkdir -p /opt/tomcat/ ADD jdk1.7.0_79 /opt/jdk/ ADD tomcat /opt/tomcat/ ENV CATALINA_HOME /opt/tomcat ENV JAVA_HOME /opt/jdk EXPOSE 8080 ENV PATH $PATH:$JAVA_HOME/bin CMD ["/opt/tomcat/bin/catalina.sh","run"]
docker學習(3)--Dockfile詳解