博客
关于我
编写 Dockerfile 生成自定义镜像
阅读量:453 次
发布时间:2019-03-06

本文共 3370 字,大约阅读时间需要 11 分钟。

一般情况下我们可以从公共渠道诸如 获取镜像上获取镜像,但是在实际生产过程中,往往需要定制化的镜像,例如修改一些配置文件,增加一些特殊的命令或软件等需求,这时就需要通过编写 Dockerfile 来生成自定义的镜像文件。

Dockerfile介绍

Dockerfile 是一个文本格式的配置文件,通过编写 Dockerfile 脚本来定义自己需要的镜像。Dockerfile 文件由一行行命令语句组成,文件中的注释信息以 # 开头。编辑好 Dcokerfile 文件之后,我们可以通过 docker build -t . 命令生成自己定义的镜像文件。

Dockerfile基本结构

我们看一下 的 Dockerfile 文件:

FROM scratchADD alpine-minirootfs-20201218-x86_64.tar.gz /CMD ["/bin/sh"]

Dockerfile 文件主要由三部分组成:

  • FROM 属于配置指令部分,表明基于的镜像名称。scratch 指从空白开始。
  • ADD 属于操作指令部分,表示向镜像内加入内容。
  • CMD 也属于操作指令部分,一般做为最后一行,表示运行容器时的操作命令。

指令说明

Dockerfile 中指令的一般格式为 INSTRUCTION arguments ,指令分两种 配置指令 和 操作指令,具体如下:

  • 配置指令
    • ARG : 定义创建镜像过程中使用的变量,格式为 ARG <name>[=<default value>]
    • FROM : 指定所创建镜像的基础镜像。格式为 FROM <image>:<tag>
    • LABEL : 为生成的镜像添加元数据标签信息,辅助过滤特定镜像。格式为 LABEL <key>=<value> <key>=<value>
    • EXPOSE : 声明镜像内服务监听的端口。格式为 EXPOSE <port>[/<protocol>]
    • ENV : 指定环境变量,该变量在容器中存在,也可在容器启动时覆盖。格式为 ENV <key> <value>
    • ENTRYPOINT : 指定镜像的默认入口命令,做为容器启动时的根命令执行。格式为 ENTRYPOINT ["executable", "param1", "param2"] 或者 ENTRYPOINT command param1 param2
    • VOLUME : 创建一个数据卷挂载点。格式为 VOLUME ["/data"]
    • USER : 指定容器运行时的用户名或UID,后续的RUN指令也使用该用户身份。格式为 USER daemon
    • WORKDIR : 配置RUN\CMD\ENTRYPOINT等指令的工作目录,推荐使用绝对路径。格式为:WORKDIR /path/to/workdir
    • ONBUILD : 指定当基于所生成镜像创建子镜像时,自动执行的操作指令。
    • STOPSIGNAL : 指定容器接收退出的信号值。格式为: STOPSIGNAL signal
    • HEALTHCHECK : 配置容器健康检查命令,自 Docker 1.12 开始支持。格式为: HEALTHCHECK [OPTIONS] CMD command
    • SHELL : 指定默认的shell类型。格式为: SHELL ["executable", "parameters"]
  • 操作指令
    • RUN : 运行指定命令。格式为: RUN <command>RUN ["executable", "param1", "param2"] 当命令较长时,可以用 \ 来换行。
    • CMD : 指定容器启动时默认执行的命令,每个Dockerfile只能有一条CMD命令。格式有三种,分别为:CMD ["executable", "param1", "param2"]CMD command param1 param2CMD ["param1", "param2"]
    • ADD : 添加内容到镜像中,将SRC内容复制到DEST中。格式为: ADD <src> <dest>
    • COPY : 复制内容到镜像中。格式为 : COPY <src> <dest>

创建镜像

创建镜像的命令格式为

$ docker build [OPTIONS] PATH | URL | -

docker build 命令读取指定路径下的 Dockerfile 文件,并将该路径下的所有数据作为上下文发送给 Docker 服务端。服务端完成 Dockerfile 格式校验后,按顺序执行指令命令,遇到ADD、COPY和RUN指令会生成新一层的镜像文件。镜像创建成功后,返回镜像ID。

docker build 还有很多选项,最常用的是通过 -t 增加标签。

$ docker build -t test:0.1 .

当 Dockerfile 所在的文件夹文件过多时,为避免向服务端上传上下文过大,可以通过 .dockerignore 文件来让 Docker 忽略无关的文件。

$ cat .dockerignore*xls*docxREADME.md

实战案例

总的来说,通过编写 Dockerfile 生成自定义镜像的过程不复杂,但是能生成高效的镜像还需要不断的尝试和联系,一般来说用于生产的镜像都尽量保证用途单一,减少镜像的层数,选择合适的基础镜像减小镜像文件大小,形成自己的版本号和标签管理规则,这样能提高自己生成镜像的质量。

下面就以一个简单定义 python 基础镜像的例子,基础的 python 镜像缺少很多包例如爬虫常用的 requests ,自己定义一个包含 requests 包的镜像,编写的 Dockerfile 如下:

FROM python:3.6RUN pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple requests

执行镜像的创建命令

$ docker build -t python-requests-3.6:0.1 .$ docker imagesREPOSITORY                                      TAG                 IMAGE ID            CREATED             SIZEpython-requests-3.6                             0.1                 3c2bb72b2066        2 minutes ago       884MBpython                                          3.6                 85146760634c        7 weeks ago         874MB$ docker run --rm -it -v "$PWD":/usr/src -w /usr/src python-requests-3.6:0.1 python3Python 3.6.12 (default, Nov 18 2020, 14:46:32) [GCC 8.3.0] on linuxType "help", "copyright", "credits" or "license" for more information.>>> import requests>>> response = requests.get("http://baidu.com")>>> print(response.text)

可以看到镜像内的 python 环境已经支持 requests 包了。利用这种方式,我们不用在本地维护开发环境,特别是多个版本的开发环境,通过 Docker 生成不同版本的镜像能够快速的实现多版本的开发环境,大家可以参考 。自己定义的各种镜像,可以上传到 DockerHub,更换电脑后仅需要安装 Docker,之前的各种开发环境就回来了。

对于 Docker 有进一步兴趣的,可以参考我的其他文章:

转载地址:http://jmrkz.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka消费者处理器_来消费kafka数据---大数据之Nifi工作笔记0037
查看>>
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
查看>>