Docker实战-编写Dockerfile

2023-11-04

一、编译镜像

1. 编译镜像

    Dockerfile类似于Makfile,用户使用docker build就可以编译镜像,使用该命令可以设置编译镜像时使用的CPU数量、内存大小、文件路径等

语法:docker build [OPTIONS] PATH| URL| - 
常见选项: 
          -t 设置镜像的名称和TAG,格式为name:tag 
          -f Dockerfile的名称,默认为PATH/Dockerfile 
例子:docker build -f ~/php.Dockerfile . 
注意:PATH是编译镜像使用的工作目录,Docker Daemon在编译开始时,会扫描PATH中的所有文件,可以在编译目录中加入.dockerignore过滤不需要的文件

    Docker Daemon从Dockerfile中顺序读取指令,生成一个临时容器,在容器中执行指令,容器编译成功后会提交作为镜像层加入最终镜像,为了加快编译过程,Docker Daemon采用了缓存机制,如果在缓存中找到了需要的中间镜像则直接使用该镜像而不生成临时容器(编译时可以使用选项–no-cache选择不使用缓存)

2. dockerignore文件

    编译开始前,Docker Daemon会读取编译目录中的.dockerignore文件,忽略其中的文件和目录,在其中可以使用通配符(?代表一个字符,*代表零个或任意个字符),使用通配符时,总会出现那么几个例外,这时可以使用!+文件名,Docker Daemon会读取!后面的文件

*/temp* 忽略PATH路径下一级子目录中以temp开头的文件和目录,如PAHT/A/temp.txt
*/*/temp* 忽略PATH路径下二级子目录中以temp开头的文件和目录,如PATH/A/B/temp.txt *.md !README.md 忽略所有md文件,除了README.md

 

二、Dockerfile指令详解

    Dockerfile由多条指令组成,每条指令在编译镜像时执行相应的程序完成某些功能,由指令+参数组成,以逗号分隔,#作为注释起始符,虽说指令不区分大小写,但是一般指令使用大些,参数使用小写

这里写图片描述

指令:FROM 
功能描述:设置基础镜像 
语法:FROM < image>[:< tag> | @< digest>] 
提示:镜像都是从一个基础镜像(操作系统或其他镜像)生成,可以在一个Dockerfile中添加多条FROM指令,一次生成多个镜像 
注意:如果忽略tag选项,会使用latest镜像


指令:MAINTAINER 
功能描述:设置镜像作者 
语法:MAINTAINER < name>


指令:RUN 
功能描述: 
语法:RUN < command> 
          RUN [“executable”,”param1”,”param2”] 
提示:RUN指令会生成容器,在容器中执行脚本,容器使用当前镜像,脚本指令完成后,Docker Daemon会将该容器提交为一个中间镜像,供后面的指令使用 
补充:RUN指令第一种方式为shell方式,使用/bin/sh -c < command>运行脚本,可以在其中使用\将脚本分为多行 
          RUN指令第二种方式为exec方式,镜像中没有/bin/sh或者要使用其他shell时使用该方式,其不会调用shell命令 
例子:RUN source $HOME/.bashrc;\ 
          echo $HOME

          RUN [“/bin/bash”,”-c”,”echo hello”]

          RUN [“sh”,”-c”,”echo”,”$HOME”] 使用第二种方式调用shell读取环境变量


指令:CMD 
功能描述:设置容器的启动命令 
语法:CMD [“executable”,”param1”,”param2”] 
          CMD [“param1”,”param2”] 
          CMD < command> 
提示:CMD第一种、第三种方式和RUN类似,第二种方式为ENTRYPOINT参数方式,为entrypoint提供参数列表 
注意:Dockerfile中只能有一条CMD命令,如果写了多条则最后一条生效


指令:LABEL 
功能描述:设置镜像的标签 
延伸:镜像标签可以通过docker inspect查看 
格式:LABEL < key>=< value> < key>=< value> … 
提示:不同标签之间通过空格隔开 
注意:每条指令都会生成一个镜像层,Docker中镜像最多只能有127层,如果超出Docker Daemon就会报错,如LABEL ..=.. <假装这里有个换行> LABEL ..=..合在一起用空格分隔就可以减少镜像层数量,同样,可以使用连接符\将脚本分为多行 
          镜像会继承基础镜像中的标签,如果存在同名标签则会覆盖


指令:EXPOSE 
功能描述:设置镜像暴露端口,记录容器启动时监听哪些端口 
语法:EXPOSE < port> < port> … 
延伸:镜像暴露端口可以通过docker inspect查看 
提示:容器启动时,Docker Daemon会扫描镜像中暴露的端口,如果加入-P参数,Docker Daemon会把镜像中所有暴露端口导出,并为每个暴露端口分配一个随机的主机端口(暴露端口是容器监听端口,主机端口为外部访问容器的端口) 
注意:EXPOSE只设置暴露端口并不导出端口,只有启动容器时使用-P/-p才导出端口,这个时候才能通过外部访问容器提供的服务


指令:ENV 
功能描述:设置镜像中的环境变量 
语法:ENV < key>=< value>…|< key> < value> 
注意:环境变量在整个编译周期都有效,第一种方式可设置多个环境变量,第二种方式只设置一个环境变量 
提示:通过${变量名}或者 $变量名使用变量,使用方式${变量名}时可以用${变量名:-default} ${变量名:+cover}设定默认值或者覆盖值 
          ENV设置的变量值在整个编译过程中总是保持不变的


指令:ADD 
功能描述:复制文件到镜像中 
语法:ADD < src>… < dest>|[“< src>”,… “< dest>”] 
注意:当路径中有空格时,需要使用第二种方式 
          当src为文件或目录时,Docker Daemon会从编译目录寻找这些文件或目录,而dest为镜像中的绝对路径或者相对于WORKDIR的路径 
提示:src为目录时,复制目录中所有内容,包括文件系统的元数据,但不包括目录本身 
          src为压缩文件,并且压缩方式为gzip,bzip2或xz时,指令会将其解压为目录 
          如果src为文件,则复制文件和元数据 
          如果dest不存在,指令会自动创建dest和缺失的上级目录


指令:COPY 
功能描述:复制文件到镜像中 
语法:COPY < src>… < dest>|[“< src>”,… “< dest>”] 
提示:指令逻辑和ADD十分相似,同样Docker Daemon会从编译目录寻找文件或目录,dest为镜像中的绝对路径或者相对于WORKDIR的路径


指令:ENTRYPOINT 
功能描述:设置容器的入口程序 
语法:ENTRYPOINT [“executable”,”param1”,”param2”] 
          ENTRYPOINT command param1 param2(shell方式) 
提示:入口程序是容器启动时执行的程序,docker run中最后的命令将作为参数传递给入口程序 
          入口程序有两种格式:exec、shell,其中shell使用/bin/sh -c运行入口程序,此时入口程序不能接收信号量 
          当Dockerfile有多条ENTRYPOINT时只有最后的ENTRYPOINT指令生效 
          如果使用脚本作为入口程序,需要保证脚本的最后一个程序能够接收信号量,可以在脚本最后使用exec或gosu启动传入脚本的命令 
注意:通过shell方式启动入口程序时,会忽略CMD指令和docker run中的参数 
          为了保证容器能够接受docker stop发送的信号量,需要通过exec启动程序;如果没有加入exec命令,则在启动容器时容器会出现两个进程,并且使用docker stop命令容器无法正常退出(无法接受SIGTERM信号),超时后docker stop发送SIGKILL,强制停止容器 
例子:FROM ubuntu <换行> ENTRYPOINT exec top -b


指令:VOLUME 
功能描述:设置容器的挂载点 
语法:VOLUME [“/data”] 
          VOLUME /data1 /data2 
提示:启动容器时,Docker Daemon会新建挂载点,并用镜像中的数据初始化挂载点,可以将主机目录或数据卷容器挂载到这些挂载点


指令:USER 
功能描述:设置RUN CMD ENTRYPOINT的用户名或UID 
语法:USER < name>


指令:WORKDIR 
功能描述:设置RUN CMD ENTRYPOINT ADD COPY指令的工作目录 
语法:WORKDIR < Path> 
提示:如果工作目录不存在,则Docker Daemon会自动创建 
          Dockerfile中多个地方都可以调用WORKDIR,如果后面跟的是相对位置,则会跟在上条WORKDIR指定路径后(如WORKDIR /A   WORKDIR B   WORKDIR C,最终路径为/A/B/C)


指令:ARG 
功能描述:设置编译变量 
语法:ARG < name>[=< defaultValue>] 
注意:ARG从定义它的地方开始生效而不是调用的地方,在ARG之前调用编译变量总为空,在编译镜像时,可以通过docker build –build-arg < var>=< value>设置变量,如果var没有通过ARG定义则Daemon会报错 
          可以使用ENV或ARG设置RUN使用的变量,如果同名则ENV定义的值会覆盖ARG定义的值,与ENV不同,ARG的变量值在编译过程中是可变的,会对比使用编译缓存造成影响(ARG值不同则编译过程也不同) 
例子:ARG CONT_IMAG_VER <换行> RUN echo $CONT_IMG_VER 
          ARG CONT_IMAG_VER <换行> RUN echo hello 
          当编译时给ARG变量赋值hello,则两个Dockerfile可以使用相同的中间镜像,如果不为hello,则不能使用同一个中间镜像


指令:ONBUILD 
功能描述:设置自径想的编译钩子指令 
语法:ONBUILD [INSTRUCTION] 
提示:从该镜像生成子镜像,在子镜像的编译过程中,首先会执行父镜像中的ONBUILD指令,所有编译指令都可以成为钩子指令


指令:STOPSIGNAL 
功能描述:设置容器退出时,Docker Daemon向容器发送的信号量 
语法:STOPSIGNAL signal 
提示:信号量可以是数字或者信号量的名字,如9或者SIGKILL,信号量的数字说明在Linux系统管理中有简单介绍


补充:ONBUILD流程

  • 编译时,读取所有ONBUILD镜像并记录下来,在当前编译过程中不执行指令
  • 生成镜像时将所有ONBUILD指令记录在镜像的配置文件OnBuild关键字中
  • 子镜像在执行FROM指令时会读取基础镜像中的ONBUILD指令并顺序执行,如果执行过程中失败则编译中断;当所有ONBUILD执行成功后开始执行子镜像中的指令
  • 子镜像不会继承基础镜像中的ONBUILD指令

补充:CMD ENTRYPOINT和RUN的区别

    RUN指令是设置编译镜像时执行的脚本和程序,镜像编译完成后,RUN指令的生命周期结束

    容器启动时,可以通过CMD和ENTRYPOINT设置启动项,其中CMD叫做容器默认启动命令,如果在docker run命令末尾添加command,则会替换镜像中CMD设置的启动程序;ENRTYPOINT叫做入口程序,不能被docker run命令末尾的command替换,而是将command当作字符串,传递给ENTRYPOINT作为参数

FROM ubuntu
ENTRYPOINT ["ps"]

//通过命令docker run --rm test启动容器,打印ps的输出
//通过命令docker run --rm test -ef启动容器,打印ps -ef的输出

    在docker run中,可以通过–entrypoint替换镜像中的入口程序,在Dockerfile中,应该至少有一条CMD或者ENTRYPOINT指令,如果同时定义了CMD和ENTRYPOINT则CMD会作为参数传递给ENTRYPOINT

FROM ubuntu
ENTRYPOINT ["ps"]
CMD ["-ef"]

//通过命令docker run --rm test启动容器,打印ps -ef的输出

 

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_29999343/article/details/78318397
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker实战-编写Dockerfile 的相关文章

  • PHP - Filter_var 替代方案?

    我构建了一个 php 脚本来输出以表单形式发布的数据 但遇到了问题 网站将运行的服务器运行 PHP 5 1 6 此版本的 PHP 不支持 filter var 我需要知道短期内的替代方案 最好是昨天 但在 Google 或 Stack Ov
  • 通过 __get() 通过引用返回 null

    快速规格 PHP 5 3 error reporting 1 the highest 我正在使用 get 通过引用技巧神奇地访问对象中任意深度的数组元素 快速示例 public function get key return isset t
  • facebook php - 如何获取专辑封面照片

    我需要使用 PHP SDK Facebook 获取专辑封面照片 我尝试 https graph facebook com ALBUM ID picture type album 但我得到默认图像 例如 获取用户 https graph fa
  • 为什么 fork 炸弹没有使 android 崩溃?

    这是最简单的叉子炸弹 我在许多 Linux 发行版上执行了它 但它们都崩溃了 但是当我在 android 终端中执行此操作时 即使授予后也没有效果超级用户权限 有什么解释为什么它没有使 Android 系统崩溃吗 一句话 ulimit Li
  • PHP 开发相当于 Mongrel/Webrick 吗?

    PHP 开发中是否有与 Rails 开发期间使用 Mongrel Webrick 等效的方法 我通常在端口 3000 上使用 Mongrel 在开发过程中为我的 Rails 应用程序提供服务 我从事 PHP 开发已经有几年了 据我所知 方法
  • 阻止注销页面后的后退按钮

    我有 php 注销页面 当用户单击注销链接时 请参阅此页面并重定向到索引页面 但是当单击后退按钮时 我会看到带有用户数据的上一页 当然 当我刷新页面时 我看不到以前的页面和数据 我在单击注销并单击后退按钮后检查了其他代码 drupal 但我
  • 如何阻止直接访问我的 JavaScript 文件?

    我使用 Minify 来缩小并缓存所有脚本请求 我只希望我的用户能够访问 JavaScript 文件的缩小版本 缩小位于www example com min我的脚本位于www example com scripts 如何阻止直接访问doc
  • PHP:读取字体文件的 TrueType/OpenType 元数据

    如何阅读字体详细信息 例如 字体在其元数据中包含版权 姓氏 设计者 版本等信息 我还希望脚本能够计算文件中的字形数量 并返回字体支持的语言 例如 典型的字体可能包含西方语言 瑞典语和罗马语言支持 并具有数百个字形 它应该支持 truetyp
  • Magento - 检查 cms 页面

    我想通过 php 检查页面是否是 Magento 中的 cms page 我需要不同的 cms 页面面包屑 所以我尝试在一个条件下做到这一点 但我不知道如何或在哪里查看 到目前为止 这是我的 breadcrumbs phtml p some
  • 语法错误,第 288 行出现意外的“endif”(T_ENDIF)[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 我一直在离线处理我的 WordPress 网站的此代码错误 解析错误 语法错误 homez 541 photoher marie
  • 使用 XSLT 将 XML 转换为 SQL

    由于我无法控制的原因 我将获得一个 XML 文件和一个 XSLT 文件 该文件可以将 XML 文件转换为 SQL 代码或错误 现在让我们假设我们可以信任提供 XML 文件的人不会在 XML 中包含危险的构造 我什至不知道是否应该使用 Sim
  • postgreSql 中特定时间后表更新

    我已经在 postgres 中创建了表 现在我想在特定时间 例如 1 小时 后更新一行 我看到很多问题 例如 https dba stackexchange com questions 56424 column auto updated a
  • 自动建议 php 的 ajax

    我有一个 html 表单 php 脚本和 jquery 我需要一个 ajax 代码来从我的 php 脚本中进行自动建议 以下是代码 表单 html
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Apache、PHP 和 MySQL 可移植吗?

    我可以在外部硬盘上运行 Apache PHP 和 MySQL 吗 我需要这个 因为我在不同的地方工作 计算机 有时我没有安装和配置所有使用的应用程序 当然可以 XAMPP http www apachefriends org en xamp
  • WordPress 插件中的类自动加载器

    我想编写一个类自动加载器以在 WordPress 插件中使用 该插件将安装在多个站点上 我想尽量减少与其他插件发生冲突的机会 自动加载器将是这样的 function autoload name some code here 我的主要问题是
  • 如何在 Zend Framework 3 中注册自定义表单视图助手

    我正在将继承的 Zend Framework 2 应用程序迁移到 Zend Framework 3 并且在注册自定义表单视图助手时遇到了一些困难 这些助手在应用程序使用版本 2 时起作用 主要用于添加标签属性以实现可访问性 例如 这是一个自
  • 如何使用 PHP 对字符串进行 rot13 处理?

    我有一个很大的 php 代码 我想手动对其进行编码和解码 我的问题是 php 代码里面有很多单引号和双引号 因此我在使用时出现错误str rot13 功能如下 那么正确的语法是什么以及如何使用下面的函数进行编码 str rot13 That
  • 检查 $_POST 数据

    我正在对表单进行一些垃圾邮件检查 下面的代码在我的本地主机上正常工作 如果为 true 则重定向到 google com 但是 当它在生产服务器上时却不起作用 执行脚本的其余部分并且不重定向到 Google com if POST SERV
  • php 数组中出现意外的 json 输出结构

    我正在尝试转换动态数据 如何从 PHP 获取此 JSON JSON 122240cb 253c 4046 adcd ae81266709a6 item 0 3 这就是我所做的 但它不起作用 PHP json array 122240cb 2

随机推荐

  • vue页面内嵌iframe使用postMessage进行数据交互(postMessage跨域通信)

    什么是postMessage postMessage是html5引入的API 它允许来自不同源的脚本采用异步方式进行有效的通信 可以实现跨文本文档 多窗口 跨域消息传递 多用于窗口间数据通信 这也使它成为跨域通信的一种有效的解决方案 vue
  • 渲染10w条数据怎么优化,虚拟列表技术上怎么实现,闪烁怎么解决

    当需要渲染大量数据时 可以采取以下优化措施 分批加载 将数据分批加载到页面上 而不是一次性加载所有数据 可以根据滚动位置或用户操作动态加载更多数据 以保持页面的响应性能 虚拟列表技术 虚拟列表技术是一种优化大量数据渲染的方法 它通过只渲染可
  • 存储过程

    好久没用过存储过程了 今天整理一下 一 定义 存储过程是一组为了完成特定功能的SQL语句的集合 它经编译后存储在数据库中 用户通过指定的调用方法执行之 存储过程具有名称 参数及返回值 并且可以嵌套调用 存储过程是经过编译的 以可执行格式永久
  • 【模型部署】Tensorrt学习记录

    tensorrt官方文档 https docs nvidia com deeplearning tensorrt archives tensorrt 723 一 简介 TensorRT是一种深度学习框架 是一种库 官方文档中的称呼是 Ten
  • Oracle查询表字段信息及注释

    查询字段信息 SELECT FROM all tab columns WHERE OWNER OWNER NAME AND TABLE NAME TABLE NAME 或者 SELECT FROM user tab columns WHER
  • 路由表的由来

    路由表的实现方法有三种 1 直连路由 2 静态路由 3 动态路由 直连路由 开启了路由器借口之后 路由表自动感知而来 当路由器吧两个接口的ip地址配置好并开启 就能从其路由表内看到这两个直连子网已经被记录 静态路由 由管理员手工配置的路由
  • webstorm中本地eslint的配置和使用,线上找不到eslint(2018版)

    前言 在webstorm中配置vue的eslint检查 注意 如果 webstrom 搜不到eslint插件 START 解决办法 1 安装 ESlint插件下载 https plugins jetbrains com p
  • MySQL中的事件

    MySQL中的事件 event 是用于执行定时或周期性的任务 类似Linux中的crontab 但是后者只能精确到分钟 事件可以精确到秒 既然MySQL自身能实现定时性任务 那么就不必在应用层实现了 事件由一个特定的线程来管理的 也就是所谓
  • Python 23.opencv 单对象模板匹配

    import cv2 import numpy as np from matplotlib import pyplot as plt img cv2 imread lane jpg 0 img2 img copy template cv2
  • STM32F030 多通道ADC DMA采集

    利用STM32F030C8T6的PA0和PA1引脚来进行两通道ADC采集 通过DMA方式 直接上代码 1 ADC的GPIO引脚配置 void ADC GPIO Config void GPIO InitTypeDef GPIO InitSt
  • 相机旋转 缩放效果 模型整体展示 部分展示

    using UnityEngine using System Collections using System Collections Generic using DG Tweening using UnityEngine EventSys
  • 修改Android镜像文件 ramdisk.img、system.img、userdata.img获取root权限

    首先 介绍一下这三个文件 ramdisk img 是你make android源代码后 生成的 out target product generic root目录下经过打包压缩而成的 system img 是你make android源代码
  • JavaWeb项目导致Linux服务器CPU过高的解决方案

    最近我部署在centos7上的一个项目出现了CPU达到了100 的状态 导致项目崩溃 起初没重视 直接重启项目解决 后面项目运行了几天服务器又报警100 了 这个时候我才意识到项目问题的严重性 然后开始查找原因 查看数据库连接池 发现数据库
  • 关于class.getResourceAsStream() 与class.getClassLoader().getResourceAsStream()区别

    首先用类加载资源文件的方式可以有以下三种 包结构图 1 InputStreaminStream DaoFactory class getResourceAsStream dao properties 2 inStream DaoFactor
  • ES6模块化及webpack配置

    前端使用的一个模块打包工具 https webpack js org webpack安装 安装 node npm 因为webpack是基于node开发的 通过 npm yarn 的方式来安装 webpack 安装方式 全局安装 npm in
  • Linux C++ 网络编程基础(2) : TCP多线程一个server对应多个client

    目录 一 linux posix线程相关函数介绍 二 tcp server基础版本 三 tpc服务端多线程版本 四 tpc客户端代码 tcp编程时 一个server可以对应多个client server端用多线程可以实现 linux下多线程
  • bash_profile和.bashrc的区别

    1 etc profile 此文件为系统的每个用户设置环境信息 当用户第一次登录时 该文件被执行 并从 etc profile d目录的配置文件中搜集shell的设置 2 etc bashrc 为每一个运行bash shell的用户执行此文
  • Java中关于thread的停止问题

    stop Deprecated public final void stop Throwable obj 已过时 该方法具有固有的不安全性 请参阅 stop 以获得详细信息 该方法的附加危险是它可用于生成目标线程未准备处理的异常 包括若没有
  • DES加密Delphi、C#互通(CBC加密模式)

    Delphi 目录 https blog csdn net dkbnull article details 87935698 unit Unit1 interface uses Windows Classes SysUtils Dialog
  • Docker实战-编写Dockerfile

    一 编译镜像 1 编译镜像 Dockerfile类似于Makfile 用户使用docker build就可以编译镜像 使用该命令可以设置编译镜像时使用的CPU数量 内存大小 文件路径等 语法 docker build OPTIONS PAT