美文网首页
Dockerfile

Dockerfile

作者: 小啊小狼 | 来源:发表于2020-10-22 09:47 被阅读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就可以查看到我们构建的镜像了,之后就可以根据需要使用此镜像了

相关文章

网友评论

      本文标题:Dockerfile

      本文链接:https://www.haomeiwen.com/subject/qjqemktx.html