Dockerfile 介紹
它是一個文本文件,鏡像文件構建腳本
由一些列用于根據基礎鏡像構建新的鏡像文件的專用指令序列組成
Dockerfile command
- ADD
- COPY
- ENV
- EXPOSE
- FROM
- MAINTANIER
- LABEL
- STOPSIGNAL
- USER
- VOLUME
- WORKDIR
FROM
必須是第一個非注釋行,用于指定所用到的基礎鏡像
語法格式
- FROM <image>[:<tag>]
- FROM <image>@<digest>
注意: 盡量不要在一個dockerfile中使用多個FROM指令
MAINTANIER
用于提供信息的指令,用于讓作者提供本人的信息
建議緊跟在FROM以后,不限制出現的位置
語法格式
MAINTANIER <authors detail>
COPY
用于docker主機復制文件指向正在創建的映像文件中
語法格式
- COPY SRC DEST
- COPY "SRC"... "DEST"
解釋
- src: 要復制的源文件或目錄,支持使用通配符
- dest: 目錄路徑,正在創建的鏡像文件的文件系統路徑,建議使用絕對路徑,否則,則相對于WORKDIR而言,所有復制生成的目錄文件的uid和gid均為0
注意
- src 必須是build上下文中的路徑,因此不能使用類似"../some"的路徑
- src 如果是目錄,遞歸復制會自動行,如果有多個src ,包括src上使用了通配符這種情況,此時,dest必須是目錄,而且必須以/結尾
- dest 如果事先不存在,它將被自動創建,包括其父目錄
ADD
類似于COPY指令,額外還支持復制tar文件,以及URL語法
語法格式
- ADD SRC DEST
- ADD "SRC" ... "DEST"
注意
- 以url格式指定的源文件,下載完成后其目標文件的權限為600
- 如果src是url,且dest不以/結尾,則src指定的文件將被下載并直接被創建為dest, 如果dest以/結尾,則url指定的文件被下載至dest中,并保留原名
- 如果src是一個tar文件,它將被展開為一個目錄,其行為類似于tar -x 命令,但是如果通過url下載到的文件是tag格式的,是不會自動被展開的
ENV
定義環境變量,此變量可被當前dockerfile文件中的其它指令調用
調用格式為$varaible_name或者${variable_name}
語法格式
- ENV <key> <value> 一次定義一個變量
- ENV <key>=<value> ... 一次定義多個變量 如果value中有空白字符,如要用\字符進行轉義
注意
- ENV 定義的環境變量在鏡像運行的整個過程中一直存在
- 因此可以使用inspect命令查看,甚至可以再docker run啟動此鏡像時候,使用--env選項來修改制定的環境值
USER
指定運行鏡像時候, 或運行Dockerfile文件中的任何RUN,CMD,/ENTRYPORINT指定的程序時的用戶名或者UID
語法格式
- USER <uid>|<USERNAME>
注意
- UID 應該使用/etc/passwd 文件存在的用戶的UID,否則,docker run可能會出現錯誤
WORKDIR
用于為Dockerfile中所有的指令指定工作目錄
語法格式
- WORKDIR <dirpath>
注意
- WORKDIR 可出現多次,也可使用相對路徑,此時表示相對于前一個WORKDIR指令指定的路徑
- WORKDIR 還可以調用ENV定義的環境變量的值
VOLUME
用于目標鏡像文件中創建一個掛載點的目錄,用于掛載主機上的卷或者其它容器的卷
語法格式
- VOLUME <mountpoint>
- VOLUME ["<mountpoint>" .... ]
RUN
于指定docker build命令過程中運行的命令
語法格式
- RUN <COMMAND>
- RUN ["executeable" ,"<param1>" ,"<param2>" ]
注意
- 每個run命令就額外加一層,所以建議一個RUN指令執行多個命令
CMD
類似于RUN指令,用于運行程序,但二者運行的是場景不同
CMD在docker run時運行而非docker build,CMD指令的首
要目的為了在于為啟動的容器指定默認要運行的程序程序
運行結束, 容器也就結束,不過,CMD指令指定的程序可被
docker run命令行參數中執行的要運行的程序所覆蓋
語法格式
- CMD <COMMAND>
- CMD ["executeable" ,"<param1>" ,"<param2>" ]
- CMD ["<para1>","<param2>"]
注意
- 第三種為ENTRYPOINT指令指定的程序的默認參數
- 如果dockefile中存在多個CMD指令,只會最后一個生效
ENTRYPOINT
類似于CMD,為容器指定默認的啟動程序,不會被docker run
所運行的程序所覆蓋.而且這些命令行參數,會被當作參數送
給ENTRYPOINT指令指定的程序但是如果運行docker run時,
使用了 --entrypoint選項,此選項的參數可當作要運行的程序覆蓋
ENTRYPOINT指令指定的程序
語法格式
- ENTRYPOINT <COMMAND>
- ENTRYPOINT ["executeable" ,"<param1>" ,"<param2>" ]
EXPOSE
用于為容器指定要暴露的端口
語法格式
- EXPOSE <PORT>[/<PROTOCAL>] [<PROT></PROTOCAL>]
- PROTOCAL: 默認為tcp,可以是tcp或者udp
例如 eg:
- EXPOSE 11211/tcp 11211/udp
ONBUILD
定義觸發器
當前dockerfile構建出的鏡像被用作基礎鏡像,去構建其他鏡像的時候,ONBUILD指令指定的操作才會被執行
語法格式
- ONBUILD <instruction>
- ONBUILD ADD my.conf /etc/mysql/my.conf
注意
ONBUILD不能自我嵌套,且不會觸發FROM和MAINTERNATER指令
docker command
docker build -t bdshello . #創建image鏡像構建Dockerfile
docker run -p 4000:80 bdshello #啟動bdshello容器 映射端口
docker run -d -p 4000:80 bdshello #后臺啟動
docker container ls #顯示所有啟動的容器
docker container ls -a #顯示所有容器包括不啟動的
docker container stop <hash id> #優雅停止容器
docker container kill <hash id> #強制停止容器
docker container rm <hash id> #移除容器
docker container rm $(docker container ls -a -q) #移除所有容器
docker image ls -a #列出所有鏡像
docker image rm <image id> #刪除鏡像
docker image rm $(docker image ls -a -q) #刪除所有鏡像