Docker學習筆記之Dockerfile

  Dockerfile的編寫格式爲<命令><形式參數>,命令不區分大小寫,但通常使用大寫字母。Docker會依據Dockerfile文件中編寫的命令順序依次執行命令。Dockerfile文件中,命令老是以FROM開始。如無FROM命令或FROM命令以前有其它命令,則沒法建立鏡像。此外,各個命令是獨立運行的,即便用RUN cd /home 轉移目錄,也不會對後面的命令產生影響。nginx

  建立鏡像時,在Dockerfile所在目錄下執行docker build命令。如根據Dockerfile建立一個名爲example的鏡像:git

sudo docker build --tag example . #建立鏡像

  1. .dockerignore

  全部與Dockerfile同目錄下的文件都稱爲「上下文」。在建立鏡像時,上下文都會被傳送到Docker守護進程,因此有必要設置不相關的文件排除在外。如:docker

>>.dockerignore文件apache

.git
hello.txt

  2. FROM

  FROM用於設置以哪一個鏡像爲基礎鏡像。Dockerfile建立的鏡像是以已有的鏡像爲基礎的。以下所示:ubuntu

>>Dockerfile文件tomcat

FROM ubuntu:latest

  命令的使用格式爲FROM <鏡像><標籤>或FROM <鏡像>。bash

  3. MAINTAINER

  MAINTAINER用於設置鏡像建立者的信息,通常輸入名字和郵箱便可。以下所示:網絡

>>Dockerfile文件ui

MAINTAINER    super lollipop <superlollipop@163.com>

  4. RUN

  RUN用於在FROM中設置的鏡像上運行腳本或命令。RUN運行結果會生成新的鏡像,運行的詳細信息記錄到鏡像歷史。以下所示:blog

>>Dockerfile文件

RUN apt install -y nginx
RUN echo "hello" >> /tmp/hello.txt

  命令格式爲RUN <命令>。

  5. CMD

  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。

相關文章
相關標籤/搜索