Docker学习笔记三 Dockerfile 指令 定制镜像

时间:2022-09-21 11:19:17

本文地址:https://www.cnblogs.com/veinyin/p/10412079.html 

镜像是分层存储的,每一层都是独立存在的,修改当前层并不会修改其依赖的上一层,删除某一层也只是假删除,让人无法访问到,实际上还是存在的。

在以上基础上,谈谈定制镜像。

定制镜像就是在已有的基础镜像上添加层,但是定制每一层添加进去的东西,比如配置、文件等。我们把对每一层的操作放进 Dockerfile 里,这样定制出来的镜像就是一致的。

Dockerfile 中的每一条指令都会创建一层。

Dockerfile 指令

Dockerfile 中,指令不区分大小写,但最好用大写突出每条指令。

FROM:指定基础镜像

 FROM: nginx

MAINTAINER:指定维护者信息

 MAINTAINER: yyh

以上指令有先后顺序,在文件中需按顺序放在第一第二编写!

RUN:执行命令

有 shell 和 exec 两种格式

尽管可以一个 RUN 指令执行一条语句,但这样会创建过多层镜像,是不科学也不必要的,正确写法应该是使用 && 将多条命令连起来。

在每条指令也就是构建每一层之后,必须有清除无关文件的命令,否则镜像会非常臃肿。

tips: '\' 换行, '#' 注释

COPY:复制文件

 COPY sourcePath targetPath

sourcePath 可以是多个,可以是通配符,targetPath 不存在时会自动创建,不用事先创建。

ADD:复制文件 plus

基本同 COPY 的使用方法和功能, ADD 的 sourcePath 可以是一个 URL,会主动下载并自动设置权限为600。

ADD 会使镜像构建缓存失效,可能会导致镜像构建很缓慢。

使用场景判断:如果是单纯复制文件,使用 COPY,如果需要自动解压缩,使用 ADD

CMD:容器启动命令

指定容器启动程序及参数

 CMD <命令>  // shell 格式
CMD ["可执行文件", "参数1", "参数2"...] // exec 格式

推荐使用 exec 格式,会被解析为 JSON 数组,一定要用双引号。

容器中所有应用都应该前台执行,没有后台服务的概念!

ENTRYPOINT 入口点

功能同 CMD,有 shell 和 exec 两种格式

如果存在 ENTERPOINT,CMD 的内容就变成了 ENTERPOINT 的参数。

可能传参就用 ENTRYPOINT,不传参就用 CMD

ENV 设置环境变量

格式如下

 ENV key value  // 一个键值对
ENV key1=value1 key2=value2 // 多个键值对

值有空格时用双引号引起来

使用时用 $key 即可取值。

ARG 构建参数

与 ENV 作用相同,但 ARG 设置的环境变量,在容器运行时不存在

VOLUME 定义匿名卷

格式如下

 VOLUME 路径  // 一个时直接接在后面
VOLUME ["路径1", "路径2"] // 多个路径放进数组

避免运行时用户忘记将动态文件所保存目录挂载为卷,保证容器存储层不会发生写操作

EXPOSE 声明端口

声明容器打算用什么端口,不会自动在宿主进行端口映射

WORKDIR 指定工作目录

USER 指定当前用户

指定用户必须事先建立好

HEALTHCHECK 健康检查

判断容器状态是否正常

 HEALTHCHECK 选项 CMD 命令  // 设置容器健康检查
HEALTHCHECK NONE // 屏蔽检查

选项如下:

  • --interval   检查间隔  默认30秒
  • --timeout  超时时间  默认30秒
  • --retries    指定连续失败次数,超过时将容器视为不健康

ONBUILD 预指令

后面跟着其它指令,当下一级镜像以此镜像为基础镜像时才会被执行

构建镜像

终端进入 Dockerfile 所在目录,输入以下命令构建镜像

 docker build -t imageName:tag .

最后面的 '.' 一定要加上,表示指定上下文路径为当前目录。

镜像其实是在远程服务端构建的,当指定上下文路径后,会将该路径下的所有内容打包,上传给 Docker 引擎,服务器便获取到本地资源。

由于只能从上下文中获取资源,因此 Dockerfile 中必须指定范围内的路径。

在执行 build 后,可以看到输出如下内容,就是在发送我们指定的上下文。

Sending build context to Docker daemon  2.048kB

tips:.dockerignore 文件可以剔除不希望上传到 Docker 引擎的资源

其它构建方法

docker 支持 URL 构建

Git repo 构建

使用 mybranch 分支,myfolder 作为构建上下文构建镜像,不指定分支或 tag 则默认为master,不指定上下文则默认为根目录。

 docker build myrepo.git#mybranch:myfolder

tar 包构建

如果 URL 是 tar 包,Docker 引擎会下载并解压缩,将其作为上下文构建镜像

docker build url

标准输入读取构建镜像

如果标准输入传入的是文本文件,将该文件视为Dockerfile,如果是压缩包,将压缩包视为上下文压缩包,解压后视为上下文构建。

END~~~≥ω≤ 

Docker学习笔记三 Dockerfile 指令 定制镜像的更多相关文章

  1. angular学习笔记&lpar;三十&rpar;-指令&lpar;10&rpar;-require和controller

    本篇介绍指令的最后两个属性,require和controller 当一个指令需要和父元素指令进行通信的时候,它们就会用到这两个属性,什么意思还是要看栗子: html: <outer‐direct ...

  2. angular学习笔记&lpar;三十&rpar;-指令&lpar;7&rpar;-compile和link&lpar;2&rpar;

    继续上一篇:angular学习笔记(三十)-指令(7)-compile和link(1) 上一篇讲了compile函数的基本概念,接下来详细讲解compile和link的执行顺序. 看一段三个指令嵌套的 ...

  3. angular学习笔记&lpar;三十&rpar;-指令&lpar;7&rpar;-compile和link&lpar;1&rpar;

    这篇主要讲解指令中的compile,以及它和link的微妙的关系. link函数在之前已经讲过了,而compile函数,它和link函数是不能共存的,如果定义了compile属性又定义link属性,那 ...

  4. angular学习笔记&lpar;三十&rpar;-指令&lpar;6&rpar;-transclude&lpar;&rpar;方法&lpar;又称linker&lpar;&rpar;方法&rpar;-模拟ng-repeat指令

    在angular学习笔记(三十)-指令(4)-transclude文章的末尾提到了,如果在指令中需要反复使用被嵌套的那一坨,需要使用transclude()方法. 在angular学习笔记(三十)-指 ...

  5. angular学习笔记&lpar;三十&rpar;-指令&lpar;5&rpar;-link

    这篇主要介绍angular指令中的link属性: link:function(scope,iEle,iAttrs,ctrl,linker){ .... } link属性值为一个函数,这个函数有五个参数 ...

  6. angular学习笔记&lpar;三十&rpar;-指令&lpar;2&rpar;-restrice&comma;replace&comma;template

    本篇主要讲解指令中的 restrict属性, replace属性, template属性 这三个属性 一. restrict: 字符串.定义指令在视图中的使用方式,一共有四种使用方式: 1. 元素: ...

  7. docker学习笔记(2) 构建镜像

    一.手动构建一个简单镜像 我们以构建nginx的docker镜像为例:手动构建镜像 docker pull centos    安装基础镜像docker run --name mynginx -it ...

  8. angular学习笔记&lpar;三十&rpar;-指令&lpar;1&rpar;-概述

    之前在 angular学习笔记(十九)-指令修改dom 里面已经简单的提到了angular中的指令,现在来详细的介绍 '指令' 一.指令的创建: dirAppModule.directive('dir ...

  9. Docker学习笔记三:Docker部署Java web系统

    Docker部署Java Web系统 1.在root目录下创建一个路径test/app mkdir test && cd test&& mkdir app && ...

随机推荐

  1. Maven学习(二) -- 坐标和依赖

    标签(空格分隔): 学习笔记 坐标 实际就像在几何中,我们用一对坐标(x, y)来表示坐标系中唯一的点:或者我们可以用(经度,纬度)来表示地球上的某一个位置,在Maven的世界中,有坐标来唯一的表示项 ...

  2. 程序设置横屏后,锁屏时会被销毁一遍,解锁时又重新加载onCreat的问题解决

    今天在写一个应用的时候,因为需要设置成横屏模式,所以在Manifest里面的Activity里面加了两个参数设置: android:screenOrientation="landscape& ...

  3. UVALive - 2965 Jurassic Remains (LA)

    Jurassic Remains Time Limit: 18000MS   Memory Limit: Unknown   64bit IO Format: %lld & %llu [Sub ...

  4. GSM Sniffing入门之软件篇:GSMTAP抓取与SMS&lpar;Short Message Service&rpar;

    重点介绍如何利用50元左右的设备,抓包并还原SMS短信内容: ps:研究GSM Sniffing纯属个人兴趣,能抓SMS报文只是捡了个明文传输的漏子,切勿用于非法用途.就像sylvain说的,osmo ...

  5. 利用ADO方式连接SQLServer2008出现的问题

    在利用ADO方式连接SQLServer2008的过程中遇到了很多问题,在网上也没有找到许多有利的信息,花了两天时间,终于把所有问题都搞定了.在这里和大家分享一下经验,希望后来者能少走弯路. 很多教程说 ...

  6. 【DFS&plus;小操作判重】【HDU2610&plus;HDU2611】Sequence

    题意 2610 按照长度优先 位置次之 输出所有不递减序列 2611 按照长度优先 大小次之 输出所有不递减序列 题解不写了 来源于http://www.cnblogs.com/wally/archi ...

  7. MyBatis 最常见错误,启动时控制台无限输出日志

    你是否遇到过下面的情况,控制台无限的输出下面的日志: Logging initialized using ‘class org.apache.ibatis.logging.log4j.Log4jImp ...

  8. text选中后displa出label内容

    效果很好而且很简单 用text的click属性即可 private sub text1_click()label1.caption="******"label2.caption=& ...

  9. Oracle杀死死锁进程

    查杀系统死锁的sql,最近想改造成存储过程,如下: CREATE OR REPLACE PROCEDURE HERO_KILLLOCKSESSION (OUT_COUNT OUT NUMBER, OU ...

  10. django集成celery之callback方式link&lowbar;error和on&lowbar;failure

    在使用django集成celery进行了异步调度任务之后,如果想对失败的任务进行跟踪或者告警,怎么做? 这里提供一个亲测的方法. 1.任务callback 假如你想在任务执行失败的时候,打印错误信息并 ...