FROM
格式:FROM <image>或FROM <image> <tag>
解釋:FROM是Docker里的第一條指令(必須是第一條),后面跟有效的鏡像名(如果該鏡像你的本地倉庫沒有則會從遠程倉庫pull?。?。然后后面的其它指令FROM的鏡像中執(zhí)行。
MAINTAINER
格式:MAINTAINER <name>
解釋:指定維護者信息,寫自己的名字就可以了
RUN
格式:RUN <command>或["executable","param1","param2"]
解釋:運行命令,命令較長可以使用\來換行,推薦使用上面數(shù)組的格式
CMD
格式:CMD ["executable","param1","param2"]使用exec執(zhí)行,推薦方式
CMD command param1 param2 在/bin/sh中執(zhí)行,提供給需要交互的應用
CMD ["param1"," param2"]提供給ENTRYPOINT的默認參數(shù)
解釋:
CMD指定容器啟動是執(zhí)行的命令,每個Dockerfile只能有一條CMD命令,如果指定了多條,只有最后一條會被執(zhí)行,如果你在啟動容器的時候也指定了命令,那么會覆蓋dockerfile構建的鏡像里面的CMD命令。
ENTRYPOINT
格式:ENTRYPOINT ["executable","param1","param2"]
ENTRYPOINT command param1 param2 (shell中執(zhí)行)
解釋:和CMD類似都是配置容器啟動后執(zhí)行的命令,并且不可被docker run提供的參數(shù)覆蓋。每個dockerfile中只能有一個ENTRYPOINT,當指定多個時,只有最后一個生效,ENTRYPOINT沒有CMD的可替換性。也就是你啟動容器的時候增加運行的命令不會覆蓋ENTRYPOINT指定的命令
所以生產(chǎn)實踐中我們可以同時使用ENTRYPOINT和CMD,例如
ENTRYPOINT ["/bin/bash"]
CMD ["--help"]
USER
格式:USER daemon
解釋:指定運行容器時的用戶名和UID,后續(xù)的RUN指令也會使用這里指定的用戶
EXPOSE
格式:EXPOSE <port> [<port>...]
解釋:設置docker容器內(nèi)部暴露的端口號,如果需要外部訪問,還需要啟動容器時增加-p或者-P參數(shù)進行分配
ENV
格式:ENV <key> <value>
解釋:設置環(huán)境變量,可以在RUN之前使用,然后RUN命令時調(diào)用,容器啟動時這些環(huán)境變量都會被指定
ADD
格式:ADD <src> <dest>
ADD ["<src>" "<dest>"]
解釋:將指定的<src>復制到容器文件系統(tǒng)中的<dest>,所有拷貝到container中的文件和文件夾權限為0775,uid和gid為0,如果文件是可識別的壓縮格式,則docker會幫助解壓縮
VOLUME
格式:VOLUME ["/data"]
解釋:可以將本地文件夾或者其他的container的文件掛載到中
WORKDIR
格式:WORKDIR /path
解釋:切換目錄,為后續(xù)的RUN、CMD、ENTRYPOINT指令配置工作目錄,可以多次切換(相當于cd),也可以使用多個WORKDIR指令,后續(xù)命令如果參數(shù)是相對路徑,則會基于之前命令指定的路徑,例如
WORKDIR /a
WORKDIR b
WORKDIR c
RUN pwd
則最終的路徑為/a/b/c
ONBUILD
ONBUILD指定的命令在構建鏡像時并不執(zhí)行,而是在它的子鏡像中執(zhí)行
ARG
格式:ARG <name> [=<default value>]
解釋:ARG指定了一個變量在docker build的時候使用,可以使用--build-arg <varname>=<value>來指定參數(shù)的值,不過如果構建的時候不指定就會報錯
例子:
容器內(nèi)安裝nginx并啟動
[root@hjy ~]# cat /opt/dockerfile/nginx/Dockerfile
# This Dockerfile
#Base image
FROM centos
#Maintainer
MAINTAINER hjy
#Commands
RUN rpm -ivh https://mirrors.aliyun.com/epel/epel-release-latest-7.noarch.rpm
RUN yum -y install nginx && yum clean all
RUN echo "daemon off;" >> /etc/nginx/nginx.conf
ADD index.html /usr/share/nginx/html/index.html
EXPOSE 80
CMD ["nginx"]