Dockerfile的編寫格式爲<命令><形式參數>,命令不區分大小寫,但通常使用大寫字母。Docker會依據Dockerfile文件中編寫的命令順序依次執行命令。Dockerfile文件中,命令老是以FROM開始。如無FROM命令或FROM命令以前有其它命令,則沒法建立鏡像。此外,各個命令是獨立運行的,即便用RUN cd /home 轉移目錄,也不會對後面的命令產生影響。nginx
建立鏡像時,在Dockerfile所在目錄下執行docker build命令。如根據Dockerfile建立一個名爲example的鏡像:git
sudo docker build --tag example . #建立鏡像
全部與Dockerfile同目錄下的文件都稱爲「上下文」。在建立鏡像時,上下文都會被傳送到Docker守護進程,因此有必要設置不相關的文件排除在外。如:docker
>>.dockerignore文件apache
.git
hello.txt
FROM用於設置以哪一個鏡像爲基礎鏡像。Dockerfile建立的鏡像是以已有的鏡像爲基礎的。以下所示:ubuntu
>>Dockerfile文件tomcat
FROM ubuntu:latest
命令的使用格式爲FROM <鏡像><標籤>或FROM <鏡像>。bash
MAINTAINER用於設置鏡像建立者的信息,通常輸入名字和郵箱便可。以下所示:網絡
>>Dockerfile文件ui
MAINTAINER super lollipop <superlollipop@163.com>
RUN用於在FROM中設置的鏡像上運行腳本或命令。RUN運行結果會生成新的鏡像,運行的詳細信息記錄到鏡像歷史。以下所示:blog
>>Dockerfile文件
RUN apt install -y nginx RUN echo "hello" >> /tmp/hello.txt
命令格式爲RUN <命令>。
CMD用於設置容器啓動時運行的腳本或命令,即便用docker run命令建立容器或使用docker start命令啓動中止的容器時運行。以下所示:
>>Dockerfile文件
CMD touch /home/hello.txt
使用格式爲CMD <命令>。
6. ENTRYPOINT
ENTRYPOINT用於設置容器啓動時運行的腳本或命令,即便用docker run命令建立容器或使用docker start命令啓動中止的容器時運行,並且ENTRYPOINT只執行一次。以下所示:
>>Dockerfile文件
ENTRYPOINT touch /home/hello.txt
使用格式爲ENTRYPOINT <命令>。
CMD與ENTRYPOINT的區別:
>>CMD的Dockerfile文件
FROM ubuntu:latest CMD echo "hello"
能夠看到,若是docker run命令後面附加上了CMD命令後,Dockerfile文件的CMD命令不會被執行。下面再看看ENTRYPOINT命令。
>>ENTRYPOINT的Dockerfile文件
FROM ubuntu:latest ENTRYPOINT ["echo", "hello"]
能夠看到,後面的echo 「world」命令被當成參數執行了Docekerfile裏面的ENTRYPOINT設置的echo命令了。至關於在容器啓動時執行了echo "hello" "echo" "world"。
注意:若是Dockerfile中有多個CMD或者ENTRYPOINT,只有最後一個CMD或ENTRYPOINT會被執行,CMD和ENTRYPOINT能夠組合使用。
7. EXPOSE
EXPOSE用於設置與主機相連的端口號,與docker run命令中的 --expose選項功能一致。
>>Dockerfile文件
EXPOSE 80 EXPOSE 443
使用格式爲EXPOSE <端口號>。使用一個EXPOSE也能夠設置多個端口號,如上面兩行能夠換成EXPOSE 80 443。
注意:EXPOSE只用於與主機進行鏈接,並不對外暴露。若想將端口暴露在外,須要在docker run命令添加選項-p或-P。
8. ENV
ENV用於設置環境變量。使用ENV設置的環境變量應用於RUN、CMD、ENTRYPOINT。以下所示:
>>Dockerfile文件
FROM ubuntu:latest
ENV HELLO 12345
CMD echo ${HELLO}
能夠看到CMD echo ${HELLO}輸出了ENV設置的變量值12345。
9. ADD
ADD用於向鏡像添加文件。以下所示:
>>Dockerfile文件
FROM ubuntu:latest ADD Diagram1.dia.autosave /Diagram1.dia.autosave
ADD apache-tomcat-9.0.24.tar.gz /
命令格式爲ADD <要複製文件的路徑> <文件在鏡像中的路徑>
能夠看到添加到容器內的兩個文件,添加的tar.gz文件會被解壓。注意:要複製的文件的路徑以上下文爲基準,即要和Dockerfile在同一文件夾下。除此,<要添加的文件>也能夠設置爲目錄或者網絡文件的URL,如ADD hello-dir /hello-dir、ADD http://localhost:8080/apache-tomcat-9.0.24.tar.gz /。
10. COPY
COPY用於向鏡像添加文件。與ADD不一樣,使用COPY添加壓縮文件時,不會解壓縮,也不能使用文件的URL。以下所示:
>>Dockerfile文件
FROM ubuntu:latest COPY Diagram1.dia.autosave /Diagram1.dia.autosave COPY apache-tomcat-9.0.24.tar.gz /
能夠看到COPY添加的tar.gz文件並無被解壓添加到容器,而是僅僅添加了壓縮包文件到容器。
11. VOLUME
VOLUME設置用於將目錄下的內容存儲到主機而非容器。以下所示:
>>Dockerfile文件
VOLUME /data VOLUME ["/data","/var/log/test"]
使用格式爲VOLUME <容器目錄>或VOLUME ["容器目錄1",「容器目錄2」]。但使用VOLUME不能與主機的特定目錄相連,若想鏈接數據卷與主機的特定目錄,則必須在docker run命令中使用-v選項。
12. USER
USER用於設置運行命令的用戶帳號,該用戶會應用於RUN、CMD、ENTRYPOINT。以下所示:
>>Dockerfike
FROM ubuntu:latest USER nobody RUN touch /tmp/hello.txt USER root RUN touch /hello.txt
首先以nobody用戶在tmp目錄下建立hello.txt文件,而後用root用戶在/目錄下建立hello.txt文件,只有root用戶有權限在/目錄下建立文件。
能夠看到/tmp/hello.txt文件的用戶全部者是nobody。
13. WORKDIR
WORKDIR用於設置執行RUN、CMD、ENTRYPOINT命令的目錄。
>>Dockerfile
WORKDIR /tmp
RUN touch hello.txt
使用格式爲WORKDIR <路徑>。上述Dockerfile會在/tmp目錄下建立hello.txt文件。
14. ONBUILD
將當前鏡像做爲基礎鏡像建立其餘鏡像時,ONBUILD指定用於設置一些要觸發的操做。ONBUILD指定的命令在構建鏡像時不會被執行,而是在其子鏡像中執行。以下所示:
>>Dockerfile
FROM ubuntu:latest ONBUILD RUN touch hello.txt
而後建立鏡像並運行容器
發現並無執行ONBUILD後的RUN touch hello.txt,而後我修改Docker文件,再以此建立的鏡像再次建立鏡像exampletest2
>>Dockerfile文件
FROM exampletest1
建立鏡像exapletest2後而且運行容器,ONBUILD觸發執行了,容器內存在文件hello.txt。