dockerfile详解

一、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构建文件

nginx-dockerfile

五、参考博文:

https://www.cnblogs.com/lighten/p/6900556.html
https://www.cnblogs.com/sorex/p/6481407.html

Previous Post

docker存储

Next Post

docker私有镜像库搭建

Related Posts