Dockerfile 简介

什么是Dockerfile

Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件

利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个新的镜像(定制镜像)

Dockerfile 示例与使用

Dockerfile使用命令 – docker build

作用:

  • 根据dockerfile创建镜像

命令格式:

  • docker build [OPTIONS] PATH | URL | -

命令参数:

  • PATH Dockerfile所在路径(文件夹路径),文件名必须是Dockerfile
  • URL Dockerfile所在URL地址
  • OPTIONS:
  • -t, --tag list 为镜像设置名称和tag
  • -f, --file string 指定Dockerfile的路径(这是可以使用其他名称命名Dockerfile)

案例演示

mkdir Dockerfile-dir
cd Dockerfile-dir/
vi Dockerfile 

输入以下内容

# 注释
FROM centos
RUN echo '这是一个测试的docker file'

执行 docker file 目录

docker build /root/Dockerfile-dir

可以在上面看到新创建的镜像没有 名称和 TAG 信息 , 使用 -t 参数指定

docker build /root/Dockerfile-dir -t test:v1.0

docker build 默认指定docker file 所在的目录,它会自动的寻找其下面的Dockerfile文件,那么我们在其目录下dockerfile不是以 Dockerfile命名的话,就会报错

可以使用 -f 参数解决这个问题

docker build . -f /root/Dockerfile-dir/test_docker_file -t test2:v1.0

对一个 docker  文件多次 build 可以发现以下规律

cat Dockerfile

docker build . -t test

 可以发现多次 build 一个docker file 使用过的命令不在执行

在 docker file 中新增一条命令

 vi Dockerfile
# 注释
FROM centos
RUN echo '这是一个测试的docker file'
RUN echo '这是一个在后面添加'

再次 build

docker build . -t test  

 可以发现,在后面新增的执行,以前旧的使用的是缓存不执行

在 docker file 前面添加一条命令

# 注释
FROM centos
RUN echo '这是一个在前面添加'
RUN echo '这是一个测试的docker file'
RUN echo '这是一个在后面添加'

再次build

docker build . -t test

可以发现所有命令都执行

由此可以得出这样的一个结论,在一个步奏修改了内容,前面的不变,后面的都会被执行  

通过查看镜像的历史记录可以知道,执行一条命令都会在原有的基础上增加一层,所以在写docker file 的时候要尽量在后面添加东西,这样就不会把前面的层重新构建

doker file 底层就是调用 docker commit 把容器变成一个镜像

Dockerfile 特征

查看官方的 Dockerfile:https://github.com/docker-library/docs

Dockerfile 构建特征(二)

Dockerfile必须具备一个FROM命令来进行构建

每一个Dockerfile命令都会构建一层镜像(本质上是每一层都会启动一个容器,执行完命令后,将容器进行提交后,产生新的镜像层)

通过查看下载下来的镜像,发现历史层信息的层ID是missing,其实是因为原本的层id只存在于构建镜像的宿主机上,一旦转移镜像后,历史层消息中将只保留最新一层的ID

Dockerfile 命令概述(一)

查看完整介绍

https://docs.docker.com/engine/reference/builder/#usage  

FROM: 指定基础镜像

RUN: 构建镜像过程中需要执行的命令。可以有多条。docker build

CMD:添加启动容器时需要执行的命令。多条只有最后一条生效。可以在启动容器时被覆盖和修改。

ENTRYPOINT:同CMD,但这个一定会被执行,不会被覆盖修改。

:为镜像添加对应的数据。

MLABELAINTAINER:表明镜像的作者。将被遗弃,被LABEL代替。

EXPOSE:设置对外暴露的端口。

ENV:设置执行命令时的环境变量,并且在构建完成后,仍然生效

ARG:设置只在构建过程中使用的环境变量,构建完成后,将消失

ADD:将本地文件或目录拷贝到镜像的文件系统中。能解压特定格式文件,能将URL作为要拷贝的文件

COPY:将本地文件或目录拷贝到镜像的文件系统中。

VOLUME:添加数据卷

USER:指定以哪个用户的名义执行RUN, CMD 和ENTRYPOINT等命令

WORKDIR:设置工作目录

Dockerfile 命令概述(二)

ONBUILD:如果制作的镜像被另一个Dockerfile使用,将在那里被执行Docekrfile命令

STOPSIGNAL:设置容器退出时发出的关闭信号。

HEALTHCHECK:设置容器状态检查。

SHELL:更改执行shell命令的程序。Linux的默认shell是[“/bin/sh”, “-c”],Windows的是[“cmd”, “/S”, “/C”]。

备忘:

  • Docker 容器与镜像之间的关系(尤其commit命令的作用和效果)
  • Dockerfile 的书写规则和使用规则
  • 查看官方的 Dockerfile:https://github.com/docker-library/docs  (看看官方的案例)

Docker 核心技术之Dockerfile的更多相关文章

  1. Docker 核心技术与实现原理

    提到虚拟化技术,我们首先想到的一定是 Docker,经过四年的快速发展 Docker 已经成为了很多公司的标配,也不再是一个只能在开发阶段使用的玩具了.作为在生产环境中广泛应用的产品,Docker 有 ...

  2. Docker核心技术

    Docker核心技术 1.cgroup 即controller group,其重要概念是子系统,首先挂载子系统,然后才有control group.例如cpu子系统,挂载至系统之后,创建一个cgrou ...

  3. Docker(二):Dockerfile 使用介绍

    上一篇文章Docker(一):Docker入门教程介绍了 Docker 基本概念,其中镜像.容器和 Dockerfile .我们使用 Dockerfile 定义镜像,依赖镜像来运行容器,因此 Dock ...

  4. Docker系列07—Dockerfile 详解

    本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...

  5. [转]Docker(三):Dockerfile 命令详解

    本文转自:https://blog.csdn.net/ityouknow/article/details/79600406 上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dock ...

  6. Docker Compose vs. Dockerfile

    Docker Compose vs. Dockerfile - which is better? - Stack Overflowhttps://stackoverflow.com/questions ...

  7. Docker(三):Dockerfile 命令详解

    上一篇文章Docker(二):Dockerfile 使用介绍介绍了 Dockerfile 的使用,这篇文章我们来继续了解 Dockerfile ,学习 Dockerfile 各种命令的使用. Dock ...

  8. Docker 入门指南——Dockerfile 指令

    COPY 复制文件 格式: COPY [--chown=<user>:<group>] <源路径>... <目标路径> 源路径可以是多个,甚至可以使通配 ...

  9. docker build 指定dockerfile

    1. Dockerfile文件使用 docker build命令会根据Dockerfile文件及上下文构建新Docker镜像.构建上下文是指Dockerfile所在的本地路径或一个URL(Git仓库地 ...

随机推荐

  1. Castle Windsor 的动态代理类如何获取实际类型

    问题 在实际开发过程当中我们可能会针对某些类型使用动态代理技术(AOP),注入了一些拦截器进行处理,但是一旦某个类型被动态代理了,那么就会生成一个代理类.这个时候在该类内部使用 GetType() 方 ...

  2. 【工利其器】必会工具之(三)systrace篇(1)官网翻译

    前言 Android 开发者官网中对systrace(Android System Trace)有专门的介绍,本篇文章作为systrace系列的开头,笔者先不做任何介绍,仅仅翻译一下官网的介绍.在后续 ...

  3. 从大数据技术变迁猜一猜AI人工智能的发展

    目前大数据已经成为了各家互联网公司的核心资产和竞争力了,其实不仅是互联网公司,包括传统企业也拥有大量的数据,也想把这些数据发挥出作用.在这种环境下,大数据技术的重要性和火爆程度相信没有人去怀疑. 而A ...

  4. 前端笔记之移动端&响应式(上)媒体查询&Bootstrap&动画库&zepto&velocity

    一.媒体(介)查询 1.1 基本语法 媒体查询由媒体类型和一个或多个检测媒体特性的条件表达式组成.媒体查询中可用于检测的媒体特性有:width.height和color(等).使用媒体查询可以在不改变 ...

  5. Python编程从入门到实践笔记——异常和存储数据

    Python编程从入门到实践笔记——异常和存储数据 #coding=gbk #Python编程从入门到实践笔记——异常和存储数据 #10.3异常 #Python使用被称为异常的特殊对象来管理程序执行期 ...

  6. JavaScript键盘鼠标事件处理

    监听键盘鼠标事件 监听某个按键事件 当键盘上的某个键被按下时,会依次触发一次下面的事件: onkeydown: 键盘按下这个动作(按下键盘) onkeypress: 键盘被按住(一直按着键盘不动) o ...

  7. k8s应用机密信息与配置管理(九)--技术流ken

    secret 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 Secret. Secret 会以 ...

  8. InnoSetup 以命令行自动编译打包

    本章介绍,在新建Innosetup的编译脚本iss文件后,在不运行Innosetup软件的基础上,以bat自动编译运行打包. 一.添加Innosetup软件包 下载InnoSetup软件包并解压到bu ...

  9. spring通知执行的顺序

    点击下载本示例相关代码 关于spring aop的具体使用,暂时不在这里讲解,后面会特定来讲解,本次主要探讨spring中通知执行的顺序. spring中通知分为以下几种: before:前置通知,在 ...

  10. Spring+MyBatis整合过程

    步骤: 1.引入Spring+MyBatis开发包 >spring(ioc aop dao)开发包 >mybatis开发包,dbcp,驱动包 >mybatis-spring.jar整 ...