一、Dockerfile介紹
1.概念
Dockerfile 是一個用來構建鏡像的文本文件,文本內容包含了一條條構建鏡像所需的指令和說明。
Dockerfile 一般分為四部分:基礎鏡像信息、維護者信息、鏡像操作指令和容器啟動時執行指令,’#’ 為 Dockerfile 中的注釋。
2.案例
[root@admin mnt]# touch Dockerfile #創建Dockerfile文件 [root@admin mnt]# vi Dockerfile #編輯Dockerfile文件
Dockerfile文件內容:
#指定基礎鏡像 FROM centos:7 #作者信息 MAINTAINER JX #指定工作目錄 WORKDIR /mnt #數據卷,將宿主機目錄映射到容器中的目錄 VOLUME /mnt /mnt #安裝java RUN yum install -y java #容器運行后執行的程序,但執行docker run后面有命令會被覆蓋 CMD ls
[root@admin mnt]# docker build -t centos:7 . #構建鏡像(使用當前目錄的Dockerfile文件創建鏡像並設置標簽,"."代表當前目錄,-t參數設置標簽)
3.查看構建的鏡像
二、Dockerfile 常用參數
序號 | 參數 | 說明 | 舉例 |
1 | FROM | 指定基礎鏡像,必須為第一個命令 | 格式:
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest> |
2 | MAINTAINER | 維護者信息 | 格式: MAINTAINER <name> 示例: MAINTAINER Jasper Xu MAINTAINER sorex@163.com MAINTAINER Jasper Xu <sorex@163.com> |
3 | RUN | 構建鏡像時執行的命令 | RUN用於在鏡像容器中執行命令,其有以下兩種命令執行方式: shell執行 格式: RUN <command> exec執行 格式: RUN ["executable", "param1", "param2"] 示例: RUN ["executable", "param1", "param2"] RUN apk update RUN ["/etc/execfile", "arg1", "arg1"] 注:
|
4 | ADD | 將本地文件添加到容器中,tar類型文件會自動解壓(網絡壓縮資源不會被解壓),可以訪問網絡資源,類似wget | 格式: ADD <src>... <dest> ADD ["<src>",... "<dest>"] 用於支持包含空格的路徑 示例: ADD hom* /mydir/ # 添加所有以"hom"開頭的文件 ADD hom?.txt /mydir/ # ? 替代一個單字符,例如:"home.txt" ADD test relativeDir/ # 添加 "test" 到 `WORKDIR`/relativeDir/ ADD test /absoluteDir/ # 添加 "test" 到 /absoluteDir/ |
5 | COPY | 功能類似ADD,但是是不會自動解壓文件,也不能訪問網絡資源 | |
6 | CMD | 構建容器后調用,也就是在容器啟動時才進行調用 | 格式: CMD ["executable","param1","param2"] (執行可執行文件,優先) CMD ["param1","param2"] (設置了ENTRYPOINT,則直接調用ENTRYPOINT添加參數) CMD command param1 param2 (執行shell內部命令) 示例: CMD echo "This is a test." | wc - CMD ["/usr/bin/wc","--help"] |
7 | ENTRYPOINT | 配置容器,使其可執行化。配合CMD可省去"application",只使用參數。 | 格式:
ENTRYPOINT ["executable", "param1", "param2"] (可執行文件, 優先)
ENTRYPOINT command param1 param2 (shell內部命令)
示例:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"] |
8 | LABEL | 用於為鏡像添加元數據 | 格式: LABEL <key>=<value> <key>=<value> <key>=<value> ... 示例: LABEL version="1.0" description="這是一個Web服務器" by="IT筆錄" 注: 使用LABEL指定元數據時,一條LABEL指定可以指定一或多條元數據,指定多條元數據時不同元數據之間通過空格分隔。推薦將所有的元數據通過一條LABEL指令指定,以免生成過多的中間鏡像。 |
9 | ENV | 設置環境變量 | 格式: ENV <key> <value> #<key>之后的所有內容均會被視為其<value>的組成部分,因此,一次只能設置一個變量 ENV <key>=<value> ... #可以設置多個變量,每個變量為一個"<key>=<value>"的鍵值對,如果<key>中包含空格,可以使用\來進行轉義,也可以通過""來進行標示;另外,反斜線也可以用於續行 示例: ENV myName John Doe ENV myDog Rex The Dog ENV myCat=fluffy |
10 | EXPOSE | 指定於外界交互的端口 | 格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080 |
11 | VOLUME | 用於指定持久化目錄 | 格式: VOLUME ["/path/to/dir"] 示例: VOLUME ["/data"] VOLUME ["/var/www", "/var/log/apache2", "/etc/apache2" 1 卷可以容器間共享和重用 2 容器並不一定要和其它容器共享卷 3 修改卷后會立即生效 4 對卷的修改不會對鏡像產生影響 5 卷會一直存在,直到沒有任何容器在使用它 |
12 | WORKDIR | 工作目錄,類似於cd命令 | 格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /a (這時工作目錄為/a)
WORKDIR b (這時工作目錄為/a/b)
WORKDIR c (這時工作目錄為/a/b/c)
|
13 | USER | 指定運行容器時的用戶名或 UID,后續的 RUN 也會使用指定用戶。使用USER指定用戶時,可以使用用戶名、UID或GID,或是兩者的組合。當服務不需要管理員權限時,可以通過該命令指定運行用戶。並且可以在之前創建所需要的用戶 | 格式: 示例: 注: 使用USER指定用戶后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都將使用該用戶。鏡像構建完成后,通過 |
14 | ARG | 用於指定傳遞給構建運行時的變量 | 格式: ARG <name>[=<default value>] 示例: ARG site ARG build_user=www |
15 | ONBUILD | 用於設置鏡像觸發器 | 格式: |