Dockerfile
2020-10-22 本文已影响0人
小啊小狼
什么是 Dockerfile?
Dockerfile是一个创建镜像所有命令的文本文件, 包含了一条条指令和说明, 每条指令构建一层, 通过docker build命令,根据Dockerfile的内容构建镜像,因此每一条指令的内容, 就是描述该层如何构建.有了Dockefile, 就可以制定自己的docker镜像规则,只需要在Dockerfile上添加或者修改指令, 就可生成docker 镜像.
Dockerfile 四部分说明:
- 一开始必须要指明所基于的镜像名称, 关键字是FROM, 这是必须的.
- 接下来是维护者信息关键字是MAINTAINER, 非必须, 但良好的习惯有利于后期的职责明确.
- 后面是镜像操作指令, 如RUN等, 每执行一条RUN命令,镜像添加新的一层.
- 最后是CMD指令,来指明运行容器时的操作命令.
一.初探
根据上面4部分创建一个简单的Dockerfile
#This is a sample image
FROM ubuntu
LABEL maintainer='liang@qq.com'
RUN apt-get update && apt-get install -y \
nginx
CMD [ 'echo', 'Hello liang' ]
二、文件内指令
1、FROM
- 指明 base image(在哪一个image的基础上创建)
- 必须要有
1.base image为基础镜像
2.往往在一个Dockerfile文件中只有一个FROM指令(多阶段构建除外)
3.FROM后跟 镜像名:版本(如果本地没有,会自动去docker hub中下载)
2、LABEL
- 指明Dockerfile的作者
- 不执行的指令
LABEL maintainer=‘’ 指定当前Dockerfile文件的维护者(作者)
LABEL description=‘’ 指定功能描述信息
3、RUN
- RUN用来在容器中执行linux命令
- a.--no-cache-dir指定不缓存
- b.RUN指令越多,那么构建出来的镜像层级就会很多,镜像尺寸就很大
- 在已存在的image顶层执行命令, 创建一个新的layer层
- 往往将需要安装的依赖,使用一个RUN来创建
Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大
可以用&&来连接多个需要执行的命令,这样执行后,只会创建 1 层镜像。
\ 表示换行
RUN yum install wget \
&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
&& tar -xvf redis.tar.gz
4、ENV
- 在容器内创建环境变量
- 用法:全局变量名=变量值
ENV username1=liang \
password1=123456
5、COPY
相当于cp命令,将宿主机中的目录或者文件复制粘贴到容器中
- a.第一个参数为宿主机中目录或在文件(相对路径或者绝对路径)
- b.第二个参数为容器中的目录或者文件(相对路径或者绝对路径)
COPY requirements.txt ./
COPY requirements.txt ./dir
6、ADD
- a.跟COPY功能类似
- b.如果第一个参数为本地的压缩文件,那么会自动解压,将解压之后的文件复制粘贴到容器中
- c.如果第一个参数为远程的路径,那么会在自动下载,将下载之后的文件复制粘贴到容器中
ADD one.zip ./
ADD http://www.keyou.site:8866/static/img/logo.3eee1364.png ./
7、WORKDIR
相当于cd命令,切换到容器中的某个目录,如果指定的目录不存在,那么会自动化创建
WORKDIR /app
8、VOLUME
VOLUME指定容器运行时,需要映射出去的目录(容器中)
VOLUME /app
9、EXPOSE
EXPOSE指定容器运行时,需要映射出去的端口号(容器中)
EXPOSE 8080
10、CMD
- 在容器运行时,会自动执行指令
- 可以使用shell类型的命令和exec类型的命令,应优先使用exec类型的命令
- 如果有多个CMD,那么只会执行最后一个
- 如果在容器运行的时候(docker run)有指定命令的话,那么CMD会被忽略,执行指定命令
#shell类型
CMD python fun.py
#exec类型,exec类型的命令["指令", "参数1", "参数2"],为json数组(必须得使用双引号)
CMD ["ls", "/"]
11、ENTRYPOINT
- 在容器运行时,会自动执行指令
- 可以使用exec类型的命令
- 如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
- 如果在容器运行的时候(docker run)有指定命令的话,那么ENTRYPOINT不会被忽略,指定的命令会作为ENTRYPOINT的参数追加在数组中
- 如果ENTRYPOINT和CMD一起用,那么CMD会作为ENTRYPOINT的默认参数
ENTRYPOINT ["ls", "/"]
三、使用Dockerfile构建镜像
可以使用如下命令将Dockerfile文件构建成镜像
- a、docker build -t 用户名/镜像名:版本号 . (别忽略最后的.)
- b、.指定在当前路径下去寻找Dockerfile
- c.默认文件名为Dockerfile
- d.如果不为文件名为Dockerfile,那么可以使用-f 手动指定
构建完成后,docker images就可以查看到我们构建的镜像了,之后就可以根据需要使用此镜像了