1、指令格式
# Comment 注释
INSTRUCTION argument 指令格式
一个完整的Dockerfile的实例
# first dockerfile for test
FROM ubuntu:14.04
MAINTAINER chao
RUN apt-get update
RUN apt-get install -y nginx
EXPOSE 80
2、各指令详解
2.1、FROM
指定一个存在的镜像
指令的格式
FROM <image>
FORM <image>:<tag>
2.2、MAINTAINER
指定镜像的作者信息,包含镜像的所有者和联系人信息
指令格式
MAINTAINER <name> [<email>]
2.3、RUN
指定当前镜像中运行的命令
指令格式
RUN <command> (shell模式)
RUN ["executable", "param1", "param2"] (exec模式)
在shell 模式下是以/bin/sh -c command 运行的
在exec模式下是以RUN ["/bin/bash", "-c", "echo hello"] 的方式运行的
2.4、 EXPOSE
指定运行该镜像的容器使用的端口
指令格式
EXPORT <port> <port>
注意EXPORT命令是告诉容器,容器中的程序会使用哪个端口,但为了安全起见,容器启动时不会主动暴露端口,必须在启动容器时指定端口映射,如一下命令
docker run --name="df_nginx" -p 80 -d chao/df_test01 nginx -g "daemon off;"
2.5、CMD
指定容器运行的默认命令,注意默认指令是指运行指定的镜像(run)时没有指定容器内运行指令时,它才会生效,如果运行容器时已指定运行的命令则CMD 命令被覆盖掉,不会起作用
指令格式
CMD ["exectuable", "param1", "param2"] (exec 模式)
CMD command param1 param2 (shell 模式)
CMD ["param1", "param2"] (作为ENTRYPOINT指令的默认参数)
2.6、ENTRYPOINT
指定容器运行的命令, 与CMD不同的是它不会被docker run 命令中的指令所覆盖,但可以使用docker run --entrypoint 强制覆盖
指令格式
ENTRYPOINT ["exectuable", "param1", "param2"] (exec模式)
ENTRYPOINT command param1 param2 (shell 模式)
联合使用ENTRYPOINT 和 CMD 命令,用ENTRYPOINT 指定容器启动的命令用CDM指定启动的默认参数
例:
ENTRYPOINT ["/var/bin/nginx"]
CMD ["-g"]
2.6、ADD & COPY
将目标文件复制到容器中,ADD包含了类似tar 的功能,如果单纯的复制文件,Docker 推荐使用COPY
指令格式
ADD <src> ...<dest>
ADD ["<src>"..."<dest>"] (适应于文件路径中有空格的情况)
COPY <src> ...<dest>
COPY ["<src>"..."<dest>"] (适应于文件路径中有空格的情况)
2.7、VOLUME
2.8、WORKDIR
指定容器的工作目录
指令格式
WORKDIR /path/to/workdir
2.9 ENV
指定容器的环境变量
指令的格式
ENV <key> <value>
ENV <key>=<value>...
2.10 USER
指定镜像是以什么用户去执行,没有指定会以root的模式去运行
指定格式
USER usr
USER user:group
USER user:gids
2.11、ONBUILD
镜像触发器,当一个镜像被其他的镜像作为基础镜像时执行
指令格式
ONBUILD [INSTRUCTION]
注:DOckerfile ONBIULD 指定的命令不会在构建镜像时执行,它只会在以此镜像构建的新的镜像才会执行
3、Dockerfile构建过程
3.1、镜像的构建过程
从基础镜像运行一个容器
执行一条指令,对容器作出修改
执行类似docker commit 的操作,提交一个新的镜像层
再基于刚提交的镜像运行一个新的容器
指定Dockerfile 中的下一条指令,直至所有指令执行完毕
注意:镜像的构建过程中间镜像不会删除,而中间层镜像运行的容器则会被删掉
3.1、使用中间层镜像镜像调试
查找错误
3.2、构建缓存
Dockerfile 构建的过程中的每一步构建的中间层镜像都会变成缓存,在再一次构建相同的中间层镜像时就会利用缓存构建镜像,使构建镜像变得高效,有事如果要避免使用缓存时可以使用docker build --no-cache, 或在Dockerfile 中加上一个无关紧要的命令,下一次再一次build的时候,修改这个变量即可, 如 “ENV REFRESH_DATE 2018--0507”
3.3、查看镜像的过程
docker history [image]