Dockerfile指令介紹

創建Docker鏡像的方式有三種
1、docker commit命令:由容器生成鏡像;
2、Dockerfile文件+docker build命令;
3、從本地文件系統導入:OpenVZ的模板。

1. Dockerfile主要指令簡介

Dockerfile 由一行行命令語句組成,並且支持以 # 開頭的註釋行。
一般地,Dockerfile 分爲四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啓動時執行指令
<br/>

基礎鏡像信息 FROM
維護者信息 MAINTAINER
鏡像操作指令 RUN、COPY、ADD、EXPOSE等
容器啓動時執行指令 CMD、ENTRYPOINT

Dockerfile文件的第一條指令必須是FROM,其後可以是各種鏡像的操作指令,最後是CMD或ENTRYPOINT指定容器啓動時執行的命令。

下面開始對dockerfile命令開始介紹:

FROM  

dockerfile裏的第一條指令,後面跟有效的鏡像名(如果該鏡像你的本地倉庫沒有則會從遠程倉庫Pull取)。後面的指令在些鏡像中執行。
FROM <image>:<tag>

FROM指定一個基礎鏡像, 一般情況下一個可用的 Dockerfile一定是 FROM 爲第一個指令,至於image則可以是任何合理存在的image鏡像;如果本地沒有指定的鏡像,則會自動從 Docker 的公共庫 pull 鏡像下載
FROM 一定是首個非註釋指令 Dockerfile.
FROM 可以在一個 Dockerfile 中出現多次,以便於創建混合的images。
如果沒有指定 tag ,latest 將會被指定爲要使用的基礎鏡像版本。

MAINTAINER

MAINTAINER <name> 這裏是用於指定鏡像製作者的信息

RUN

後跟要執行的linux命令,每一條RUN指令(可能會有多條linux命令)會在當前容器最上面的可讀寫層執行並且提交成一個新的鏡像層,接下來的指令會在這個新的鏡像層裏執行。

RUN <command> (the command is run in a shell – /bin/sh -c – shell form)

RUN ["executable", "param1", "param2"] (exec form)
RUN echo "Asia/Shanghai" > /etc/timezone

注意下面的情況:  
不要在一條RUN指令裏單一使用apt-get update命令,這樣可能會導致以後的apt-get install 安裝出錯。

避免使用RUN apt-get upgrade 或者dist-upgrade,這樣有些重要的軟件包可能更新失敗,如果你確實想要更新某個包A,使用apt-get install install -y A 。這樣會自動更新這個軟件包。

COPY
COPY 將文件從路徑 <src> 複製添加到容器內部路徑 <dest>。
<src> 必須是想對於源文件夾的一個文件或目錄,也可以是一個遠程的url,<dest> 是目標容器中的絕對路徑。
所有的新文件和文件夾都會創建UID 和 GID 。事實上如果 <src> 是一個遠程文件URL,那麼目標文件的權限將會是600。

ADD
ADD 將文件從路徑 <src> 複製添加到容器內部路徑 <dest>。
<src> 必須是想對於源文件夾的一個文件或目錄,也可以是一個遠程的url。<dest> 是目標容器中的絕對路徑。
所有的新文件和文件夾都會創建UID 和 GID。事實上如果 <src> 是一個遠程文件URL,那麼目標文件的權限將會是600。

USER
USER 用來切換運行屬主身份的。Docker 默認是使用 root,但若不需要,建議切換使用者身分,畢竟 root 權限太大了,使用上有安全的風險。

CMD

CMD指令指定你製作出來的鏡像在啓動成容器時運行命令的默認的參數。

CMD有三種寫法:

CMD ["executable","param1","param2"] (exec form, this is the preferred form)

CMD ["param1","param2"] (as default parameters to ENTRYPOINT)

CMD command param1 param2 (shell form)

第一種是可執行文件加參數,第二種是作爲ENTRYPOINT的參數,第三種是作爲”/bin/sh -c”的參數。

注意點:
docker run命令如果指定了參數會把CMD裏的參數覆蓋: (這裏說明一下,如:docker run -it ubuntu /bin/bash 命令的參數是指/bin/bash 而非 -it ,-it只是docker 的參數,而不是容器的參數,以下所說參數均如此。)

這裏CMD與ENTRYPOINT的區別強烈推薦你去看 論docker CMD與ENTRYPOINT的大區別 http://www.cnblogs.com/programfish/p/4101884.html 這篇文章。看完你就懂了。

ENTRYPOINT

ENTRYPOINT字面意思指定容器的進入點。可以把你的容器製作成類似可執行文件的用法。這個指令會覆蓋它前面的CMD指令,而多個 ENTRYPOINT指令只有最後一個生效(後面覆蓋前面)。同時你也可以在在啓動container 的時候指定–entrypoint參數來覆蓋dockerfile裏的ENTRYPOINT。詳見官方文檔。

例如我用了這樣的指令製作鏡像名叫echotest:

ENTRYPOINT ["/bin/echo"]

然後之後這樣運行:

docker run -it echotest “this is a echo”

實際上是平時這樣的命令:

docker run -it echotest /bin/echo “this is a echo”

這樣你應該明白了吧。 這樣一個容器的行爲就很類似一個可執行文件了。 這裏CMD與ENTRYPOINT的區別強烈推薦你去看 論docker CMD與ENTRYPOINT的大區別 http://www.cnblogs.com/programfish/p/4101884.html 這篇文章。看完你就懂了。

EXPOSE

EXPOSE指定容器對外暴露的端口號。

ENV

ENV指令可以用於爲docker容器設置環境變量,例如你要確保CMD[“nginx”]能成功啓動,你應該用ENV PATH /usr/local/nginx/bin:$PATH設定環境變量。另外你可以設定另外一些變量用於RUN命令裏以便於dockerfile文件的維護:

ENV PG_MAJOR 9.3
ENV PG_VERSION 9.3.4
#設置環境變量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive

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

這樣多次出現版本號就可以通過一個變量來管理方便維護。

VOLUME   

VOLUME ["path"] 創建一個可以從本地主機或其他容器掛載的掛載點,一般用來存放數據庫和需要保存的數據等。
爲了能夠保存(持久化)數據以及共享容器間的數據,Docker提出了Volume的概念,Volume就是目錄或者文件,它可以繞過默認的聯合文件系統,而以正常的文件或者目錄的形式存在於宿主機上
FROM debian:wheezy
VOLUME /data(容器目錄)

docker run -v /home/adrian/data:/data debian ls /data

WORKDIR

WORKDIR 用來切換工作目錄的。Docker 默認的工作目錄是/,只有 RUN 能執行 cd 命令切換目錄,而且還只作用在當下下的 RUN,也就是說每一個 RUN 都是獨立進行的。如果想讓其他指令在指定的目錄下執行,就得靠 WORKDIR。WORKDIR 動作的目錄改變是持久的,不用每個指令前都使用一次 WORKDIR。

ONBUILD
ONBUILD 的作用就是讓指令延遲執行,延遲到下一個使用 FROM 的 Dockerfile 在建立 image 時執行,只限延遲一次。
ONBUILD 的使用情景是在建立鏡像時取得最新的源碼 (搭配 RUN) 與限定系統框架

ARG
ARG是Docker1.9 版本才新加入的指令。
ARG 定義的變量只在建立 image 時有效,建立完成後變量就失效消失

LABEL
定義一個 image 標籤 Owner,並賦值,其值爲變量 Name 的值。(LABEL Owner=$Name )

ONBUILD
配置當所創建的鏡像作爲其它新創建鏡像的基礎鏡像時,所執行的操作指令。

例如,Dockerfile 使用如下的內容創建了鏡像 image-A:
[...]
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
[...]
如果基於 image-A 創建新的鏡像時,新的 Dockerfile 中使用 FROM image-A 指定基礎鏡像時,會自動執行 ONBUILD 指令內容,等價於在後面添加了兩條指令。

2. 構建鏡像

寫好Dockerfile文件後就可以在該目錄下運行docker build . 命令了(可以用 -t 參數指定tag)。
docker build -t centos:base .

緩存
--no-cache=true ###禁止緩存
Docker在首先檢查每一條指令的時候會去cache裏搜 查是否有執行過這條指令並且可以複用的鏡像,如果沒有再去構造一個新的鏡像。這是默認的情況,如果你指定不要這個過程可以在docker build裏用如下參數

3. 案例:構建tomcat鏡像

###1、構建鏡像可以運行tomcat的鏡像環境
###2、啓動容器運行tomcat程序
#################################
#1、指定基礎鏡像centos7
FROM openshift/base-centos7
MAINTAINER wuyan

#2、通過yum方式安裝jdk1.8
RUN yum install java -y

#3、將本地tomcat程序添加到容器中
RUN mkdir -p /ghca/
ADD apache-tomcat-7.0.75 /ghca/apache-tomcat-7.0.75
RUN chmod -R 775 /ghca

ADD start_tomcat.sh /ghca/start_tomcat.sh
RUN chmod 775 /ghca/start_tomcat.sh

#4、配置tomcat環境變量
ENV CATALINA_HOME /ghca/apache-tomcat-7.0.75
ENV PATH $PATH:$CATALINA_HOME/bin

#5、容器端口配置
EXPOSE 8090
#6、啓動tomcat
CMD /ghca/start_tomcat.sh && tail -f /ghca/apache-tomcat-7.0.75/logs/catalina.out

<<完畢>>

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章