一、dockerfile简介
docker可以通过从Dockerfile读取指令来自动构建镜像。Dockerfile是一个文本文档,其中包含用户可以在命令行上调用以组装图像的所有命令。使用Docker构建用户可以创建一个自动构建,连续执行几条命令行指令。
在一个文件夹中,如果有一个名字为Dockfile的文件,其内容满足语法要求,在这个文件夹路径下执行命令:docker build –tag name:tag .,就可以按照描述构建一个镜像了。name是镜像的名称,tag是镜像的版本或者是标签号,不写就是lastest。注意后面有一个空格和点。
二、Dockerfile官方文档
https://docs.docker.com/engine/reference/builder/
三、格式
# Comment
INSTRUCTION arguments
四、常用关键字
FROM MAINTAINER LABEL RUN ADD COPY CMD ENTRYPOINT ENV EXPOSE VOLUME WORKDIR USER ARG
1 FROM
说明:
指定基础镜像,必须为第一个命令
如果镜像本地没有,则从公共库拉取
没有指定镜像标签,则会使用默认的latest标签。
1.1 使用方式
FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
1.2 使用示例
FROM nginx:latest
2. MAINTAINER
说明:
描述镜像的创建者,名称和邮箱
2.1 使用方式
MAINTAINER mingliang sorex@163.com
2.2 示例
MAINTAINER mingliang
MAINTAINER test@qq.com
MAINTAINER mingliang test@qq.com
3.LABEL
说明:
给镜像添加信息。
3.1 使用方式与示例
LABEL "com.example.vendor"="ACME Incorporated"
LABEL com.example.label-with-value="foo"
LABEL version="1.0"
LABEL description="This text illustrates \
that label-values can span multiple lines."
4. RUN
说明:
构建镜像时执行的命令
RUN命令执行完成后会成为一个新的镜像,这里也是指镜像的分层构建。一句RUN就是一层,也相当于一个版本。这就是之前说的缓存的原理。我们知道docker是镜像层是只读的,所以你如果第一句安装了软件,用完在后面一句删除是不可能的。所以这种情况要在一句RUN命令中完成,可以通过&符号连接多个RUN语句。RUN后面的必须是双引号不能是单引号(没引号貌似也不要紧),command是不会调用shell的,所以也不会继承相应变量,要查看输入RUN “sh” “-c” “echo” “$HOME”,而不是RUN “echo” “$HOME”。
4.1 使用方式
RUN <command>
# 运行可执行文件
RUN ["executable", "param1", "param2"]
4.2 示例
RUN yum install nginx -y
5. ADD
说明:
将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压
5.1 使用方式
ADD <src> <dest>
5.2 示例
ADD test\/ \/opt\/test\/
6.COPY
同ADD,只是不会解压文件
7.CMD
说明
容器构建完成后,启动时,执行的命令。
71. 使用方式
CMD ["executable","param1","param2"] (执行可执行文件,优先)
CMD ["param1","param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
7.2 示例
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc","--help"]
8.ENTRYPOINT
说明
容器构建完成后,启动时,执行的命令。
8.1 使用方式
ENTRYPOINT ["executable", "param1", "param2"] (可执行文件, 优先)
ENTRYPOINT command param1 param2 (shell内部命令)
8.2 示例
ENTRYPOINT ["top", "-b"]
8.3 CMD和ENTRYPOINT的区别
ENTRYPOINT不能被docker run命令的执行命令覆盖,如果要覆盖需要带上选项–entrypoint,如果有多个选项,只有最后一个会生效。
9.ENV
说明
设置容器的环境变量,可以让其后面的RUN命令使用,容器运行的时候这个变量也会保留。
9.1 使用方式
ENV 只能设置一个
ENV = 允许一次设置多个
9.2 示例
ENV myName="John Doe" myDog=Rex\ The\ Dog \
myCat=fluffy
等同于
ENV myName John Doe
ENV myDog Rex The Dog
ENV myCat fluffy
10.EXPOSE
说明
指定于外界交互的端口
10.1 使用方式
EXPOSE [...]
10.2 示例
EXPOSE 80 443 透传容器的443端口到宿主机的80
EXPOSE 8080
11.WORKDIR
说明:
为RUN、CMD、ENTRYPOINT指令配置工作目录。可以使用多个WORKDIR指令,后续参数如果是相对路径,则会基于之前的命令指定的路径。如:WORKDIR /home WORKDIR test 。最终的路径就是/home/test。path路径也可以是环境变量,比如有环境变量HOME=/home,WORKDIR $HOME/test也就是/home/test。
11.1 使用方式
WORKDIR /path/to/workdir
11.2 示例
WORKDIR /a (这时工作目录为/a)
WORKDIR b (这时工作目录为/a/b)
WORKDIR c (这时工作目录为/a/b/c)
12. USER
说明:
指定运行容器时的用户名或UID,后续的RUN、CMD、ENTRYPOINT也会使用指定的用户运行命令。
12. 镜像示例
安装nginx的示例
FROM centos
MAINTAINER test "xx@qq.com"
RUN yum install nginx -y
ADD inde.html /usr/share/nginx/html
WORKDIR /usr/sbin/
ENV PATH
EXPOSE 80 80
CMD ["nginx", "-g", "daemon off;"]
13. docekr hub共有nginx镜像dockerfile构建文件
五、参考博文:
https://www.cnblogs.com/lighten/p/6900556.html
https://www.cnblogs.com/sorex/p/6481407.html