03-DockerFile

nobility 发布于 2022-07-27 2609 次阅读


DockerFile

Dockerfile是一个Docker镜像的描述文件,Dockerfile其内部包含了一条条的指令,每条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建

  • FROM:用于描述使用的基础镜像,在该指令后写依赖的镜像名和版本号即可,若不依赖任何镜像该指令后写scratch即可
  • LABEL:用于描述镜像的元信息,使用键值对的形式表示,通常用于标注一些作者信息等
  • RUN:用于执行命令行命令的,由于每一条指令都会构建一层,所以为了减少无用的分层,应该合并多条命令为一行,换行使用反斜杠,多个命令使用与运算符,保证前面命令执行成功后后面命令才会执行
    • shell格式:该命令后直接跟shell命令即可
    • exec格式:该命令后跟有方括号数组,数组的第一项是命令,其余的是参数,命令和参数都属于字符串,所以需要使用双引号进行包裹,有点向函数调用形式
  • CMD:设置容器启动后默认执行的命令和参数
    • docker run中指定了其他命令,该命令会被忽略
    • 定义多个CMD只有最后一个会被执行
  • ENTRYPOINT:设置容器启动时执行的命令,可让容器以服务的形式运行
    • 不会被忽略,一定会执行,通常用于执行一个shell脚本
  • WORKDIR:用于指定工作目录,若指定的目录不存在会自动创建该目录,不使用RUN cd命令,而是使用该命令改变工作目录,应该尽量使用绝对路径
  • COPY:用于将执行构建命令的目录中的文件拷贝到容器中的工作目录中
    • RUN命令一样,也有两种使用格 式
    • 可使用Linux中的文件通配符,星号、问号
    • 默认情况下源文件的各种元数据都会保留,即读写执行权限等,该命令后使用--chown=所属用户:所属组修改,比如COPY --chown=user:user source target
    • 若源路径为文件夹,复制的时是将文件夹中的内容进行复制
  • ADD:和COPY命令使用方式和作用几乎一致,附加了一些功能
    • 可从网络URL进行获取源文件
    • 若是压缩文件(gzipbzip2xz)会自动解压
  • EVN:用于设置环境变量,可用于下面RUN指令使用
  • EXPOSE:要暴露出的服务端口
  • VOLUME:预先将容器中的某个目录在运行时自动挂载为匿名卷,为了防止运行时用户忘记将动态文件所保存目录挂载为卷,任何向该目录中写入的数据都不会记录进容器存储层,从而保证了容器存储层的无状态化

服务式镜像

简单的node服务器程序

const express = require('express')
const app = express()
app.get('/', (req, res) => res.send('Hello World!'))
app.listen(8000, () => console.log(`runing 8000 port`))

Dockerfile配置,运行时将注释删除,否则可能会被当作命令的一部分

FROM node:10.16.3
LABEL message="app server"
COPY app.js /app/app.js  #上传本地文件到容器中
WORKDIR /app/  #移到工作目录
RUN npm install express --registry=https://registry.npm.taobao.org  #运行环境安装命令
ENTRYPOINT node app.js  #容器启动后运行服务程序
EXPOSE 8000  #暴露8000端口

工具式镜像

Dockerfile配置,运行时将注释删除,否则可能会被当作命令的一部分

FROM centos
LABEL message="cli"
ENTRYPOINT ["/usr/bin/echo"]  #这里是工具命令
CMD ["hello"]  #这里是命令参数,默认是hello
此作者没有提供个人介绍
最后更新于 2022-07-27