Dockerfile创建详解

2023-05-16

Docker Dockerfile

什么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

使用 Dockerfile 定制镜像

这里仅讲解如何运行 Dockerfile 文件来定制一个镜像,具体 Dockerfile 文件内指令详解,将在下一节中介绍,这里你只要知道构建的流程即可。

1、下面以定制一个 nginx 镜像(构建好的镜像内会有一个 /usr/share/nginx/html/index.html 文件)

在一个空目录下,新建一个名为 Dockerfile 文件,并在文件内添加以下内容:


FROM nginx
RUN echo '这是一个本地构建的nginx镜像' > /usr/share/nginx/html/index.html  

2、FROM 和 RUN 指令的作用

FROM:定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。后续的操作都是基于 nginx。

RUN:用于执行后面跟着的命令行命令。有以下俩种格式:

shell 格式:


RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。  

exec 格式:


RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline  

注意:Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。例如:

FROM centos
RUN yum -y install wget
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"
RUN tar -xvf redis.tar.gz

以上执行会创建 3 层镜像。可简化为以下格式:

FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

如上,以 && 符号连接命令,这样执行后,只会创建 1 层镜像。

开始构建镜像

在 Dockerfile 文件的存放目录下,执行构建动作。

以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。

:最后的 . 代表本次执行的上下文路径,下一节会介绍。

$ docker build -t nginx:v3 .

以上显示,说明已经构建成功。

上下文路径

上一节中,有提到指令最后一个 . 是上下文路径,那么什么是上下文路径呢?

$ docker build -t nginx:v3 .

上下文路径,是指 docker 在构建镜像,有时候想要使用到本机的文件(比如复制),docker build 命令得知这个路径后,会将路径下的所有内容打包。

解析:由于 docker 的运行模式是 C/S。我们本机是 C,docker 引擎是 S。实际的构建过程是在 docker 引擎下完成的,所以这个时候无法用到我们本机的文件。这就需要把我们本机的指定目录下的文件一起打包提供给 docker 引擎使用。

如果未说明最后一个参数,那么默认上下文路径就是 Dockerfile 所在的位置。

注意:上下文路径下不要放无用的文件,因为会一起打包发送给 docker 引擎,如果文件过多会造成过程缓慢。


指令详解

COPY

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

格式:


COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]  

[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如:


COPY hom* /mydir/
COPY hom?.txt /mydir/  

<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

ADD

ADD 指令和 COPY 的使用格类似(同样需求下,官方推荐使用 COPY)。功能也类似,不同之处如下:

  • ADD 的优点:在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。
  • ADD 的缺点:在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

  • CMD 在docker run 时运行。
  • RUN 是在 docker build。

作用:为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

注意:如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

格式:


CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数  

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是 sh。

ENTRYPOINT

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是, 如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

格式:


ENTRYPOINT ["<executeable>","<param1>","<param2>",...]  

可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参,以下示例会提到。

示例:

假设已通过 Dockerfile 构建了 nginx:test 镜像:


FROM nginx

ENTRYPOINT ["nginx", "-c"] # 定参
CMD ["/etc/nginx/nginx.conf"] # 变参   

1、不传参运行


$ docker run  nginx:test  

容器内会默认运行以下命令,启动主进程。


nginx -c /etc/nginx/nginx.conf  

2、传参运行


$ docker run  nginx:test -c /etc/nginx/new.conf  

容器内会默认运行以下命令,启动主进程(/etc/nginx/new.conf:假设容器内已有此文件)


nginx -c /etc/nginx/new.conf  

ENV

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

格式:


ENV <key> <value>
ENV <key1>=<value1> <key2>=<value2>...  

以下示例设置 NODE_VERSION = 7.2.0 , 在后续的指令中可以通过 $NODE_VERSION 引用:


ENV NODE_VERSION 7.2.0

RUN curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION-linux-x64.tar.xz" \
  && curl -SLO "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc"  

ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。

构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

格式:


ARG <参数名>[=<默认值>]  

VOLUME

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

作用:

  • 避免重要的数据,因容器重启而丢失,这是非常致命的。
  • 避免容器不断变大。

格式:


VOLUME ["<路径1>", "<路径2>"...]
VOLUME <路径>  

在启动容器 docker run 的时候,我们可以通过 -v 参数修改挂载点。

EXPOSE

仅仅只是声明端口。

作用:

  • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
  • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

格式:


EXPOSE <端口1> [<端口2>...]  

WORKDIR

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。(WORKDIR 指定的工作目录,必须是提前创建好的)。

docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

格式:


WORKDIR <工作目录路径>  

USER

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

格式:


USER <用户名>[:<用户组>]  

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

格式:


HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。  

ONBUILD

用于延迟构建命令的执行。简单的说,就是 Dockerfile 里用 ONBUILD 指定的命令,在本次构建镜像的过程中不会执行(假设镜像为 test-build)。当有新的 Dockerfile 使用了之前构建的镜像 FROM test-build ,这时执行新镜像的 Dockerfile 构建时候,会执行 test-build 的 Dockerfile 里的 ONBUILD 指定的命令。

格式:


ONBUILD <其它指令>  

LABEL

LABEL 指令用来给镜像添加一些元数据(metadata),以键值对的形式,语法格式如下:


LABEL <key>=<value> <key>=<value> <key>=<value> ...  

比如我们可以添加镜像的作者:


LABEL org.opencontainers.image.authors="runoob"  

 Docker 仓库管理

Docker Compose

2 篇笔记 写笔记

  1.    Constantin

      231***9881@qq.com

       参考地址

    166

    Dockerfile指令说明简洁版:

    • FROM

    构建镜像基于哪个镜像

    • MAINTAINER

    镜像维护者姓名或邮箱地址

    • RUN

    构建镜像时运行的指令

    • CMD

    运行容器时执行的shell环境

    • VOLUME

    指定容器挂载点到宿主机自动生成的目录或其他容器

    • USER

    为RUN、CMD、和 ENTRYPOINT 执行命令指定运行用户

    • WORKDIR

    为 RUN、CMD、ENTRYPOINT、COPY 和 ADD 设置工作目录,就是切换目录

    • HEALTHCHECH

    健康检查

    • ARG

    构建时指定的一些参数

    • EXPOSE

    声明容器的服务端口(仅仅是声明)

    • ENV

    设置容器环境变量

    • ADD

    拷贝文件或目录到容器中,如果是URL或压缩包便会自动下载或自动解压

    • COPY

    拷贝文件或目录到容器中,跟ADD类似,但不具备自动下载或解压的功能

    • ENTRYPOINT

    运行容器时执行的shell命令

    Constantin

       Constantin

      231***9881@qq.com

       参考地址

    10个月前 (12-28)
  2.    senssic

      sen***c@foxmail.com

    70

    dockerfile 的命令摘要

    • FROM- 镜像从那里来
    • MAINTAINER- 镜像维护者信息
    • RUN- 构建镜像执行的命令,每一次RUN都会构建一层
    • CMD- 容器启动的命令,如果有多个则以最后一个为准,也可以为ENTRYPOINT提供参数
    • VOLUME- 定义数据卷,如果没有定义则使用默认
    • USER- 指定后续执行的用户组和用户
    • WORKDIR- 切换当前执行的工作目录
    • HEALTHCHECH- 健康检测指令
    • ARG- 变量属性值,但不在容器内部起作用
    • EXPOSE- 暴露端口
    • ENV- 变量属性值,容器内部也会起作用
    • ADD- 添加文件,如果是压缩文件也解压
    • COPY- 添加文件,以复制的形式
    • ENTRYPOINT- 容器进入时执行的命令
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile创建详解 的相关文章

  • Ubuntu Budgie 22.04 设置中文语言并安装拼音输入法

    之前将ubuntu server 22 04 安装了 Budgie Desktop 桌面环境 xff0c 系统语言是英文的 xff0c 如果要作为桌面使用还有些不适应 xff0c 我们要如何将系统语言切换为中文并支持中文输入呢 xff1f
  • OpenKylin常用软件安装

    由于OpenKylin仍处于测试阶段 xff0c 应用商店软件并不全 xff0c 所以很多软件的安装非常麻烦 xff0c 以下列出了一些常用软件的安装方法 需要的童鞋可以直接复制命令后进行安装 xff0c 安装软件需要使用root权限 xf
  • 利用sourceinsight宏(Quicker.em)提高编码效率和质量

    利用sourceinsight宏 Quicker em 提高编码效率和质量 Marco是sourceinsight软件一个强大的功能 xff0c 用户可以通过编写宏来实现自定义功能 这里有个比较流行的宏文件quicker em xff0c
  • Git Clone 报错 `SSL certificate problem: unable to get local issuer certificate`

    如果您在尝试克隆Git存储库时得到 SSL certificate problem unable to get local issuer certificate 的错误 这意味着Git无法验证远程存储库的SSL证书 如果SSL证书是自签名的
  • 树莓派从源码构建安装Git最新版

    1 查看Git版本 首先我们通过SSH客户端连接树莓派 在树莓派中通过查看 Git 版本信息 xff0c 我们只能看到最高版本显示为 2 30 2 xff0c 并且通过apt安装也无法将Git更新到最新版 git version sudo
  • linux安装部署免费confluence wiki

    Centos7安装部署免费confluence wiki 知识库 详细操作步骤 前言 xff1a confluence是团队协作软件 xff0c 改变团队工作方式 xff0c 作为现代化办公不可缺少的工具 wiki所需的安装包 xff1a
  • 对printf源码的分析

    对printf源码的分析 一 printf的源码如下 span class token macro property span class token directive keyword include span span class to
  • iPhone开发:可拉伸的图片

    还记得在Windows下用MFC或WTL写用户界面程序的时候 xff0c 为了给可改变大小的对话框加上背景图案 xff0c 需要对设计师提供的图片进行裁剪 把图片切成九块 xff0c 其中四个角是不拉伸的 xff0c 四条棱边可以在一个方向
  • 解决在KDE桌面环境WebStorm不能输入中文问题

    由于jetbrains官方包的问题 xff0c Fcitx5输入法文字候选托盘暂时不能更改 xff0c 如有最新解决办法 xff0c 可查看ArchWiki官方 xff0c 或者查看jetbrains官方 排查错误 cat etc loca
  • NAS如何使用SnapShot快照功能?

    Snapshot是基于Btrfs文件系统产生的快速备份和还原数据的第三方应用 xff0c 利用Snapshot为数据提供保护 xff0c 以防止因意外删除 应用程序崩溃 数据损毁和病毒所造成的数据丢失 1 TOS应用中心 xff0c 找到S
  • 备份电脑不求人,"时间机器"轻松备份你的Mac

    相比Windows 自带的系统还原功能 xff0c Mac有内置的Time Machine功能 xff0c 可以方便我们进行整机备份 xff0c 在关键时刻成为你重要数据的一颗 后悔药 xff01 Time Machine xff08 时间
  • NESTJS 服务化架构设计和项目搭建

    创建项目很简单 xff0c nest cli一键创建 xff0c 关键是如何基于nestjs现有能力进行架构设计 架构设计 项目背景 项目涉及的底层数据全部来自于公司的一个公共服务 jsf xff0c 该公共服务可对接口进行发布和订阅 xf
  • 视频转码 ffmpeg hevc to h264

    通过ffmpeg将hevc编码的MP4视频转码为h264编码 fmpeg i inputfile map 0 c a copy c s copy c v libx264 output mp4 顺带旋转角度也调整为0 参考 xff1a htt
  • linux下查看进程的状态 /proc/[pid]/status

    查看进程的状态 xff1a 1 查看进程的pid xff0c 以java为例 xff1a ps ef grep java 2 查看进程状态 xff1a cat proc pid status 关键字 linux root 64 localh
  • paho.mqtt.cpp交叉编译

    开发板 rk3288 43 lubuntu 16 04 主机 Ubuntu16 04 编译之前可能要安装一些软件 xff0c 可参考paho mqtt cpp文档 xff1a https github com eclipse paho mq
  • mosquitto-1.6.10 交叉编译

    openssl 1 0 2l tar gz mosquitto 1 6 10 tar gz 由于mosquitto 1 6 10版本较新 xff0c 需要选择openssl 1 0 2及较新版本 1 openssl span class t
  • C/C++ 简单debug宏函数

    span class token comment debug h span span class token macro property span class token directive hash span span class to
  • ubuntu 18.04 LTS 安装Qt qtcreator 、example

    https www cnblogs com SendBoringBackToNoWhere p 15050359 html sudo apt install qtcreator qt5 default qtbase5 examples qt
  • ubuntu 文件系统自动挂载U盘后是只读文件问题

    安装 ntfs 3g exfat fuse xff0c 之后重新挂载 apt get install ntfs 3g exfat fuse 重新挂载
  • mt7688 OpenWrt 编译

    一 OpenWrt源码下载 虚拟机 xff1a Ubuntu 16 04 LTS sudo apt install git subversion curl wget gawk git clone https git openwrt org

随机推荐

  • mysql trigger 使用以及与 sqlite3 trigger 比较

    一 触发事件的表与触发更新的表使用同一个表 使用情景 xff0c 表里的某行数据发生update时自动更新修改时间 updated sqlite3 3 40 0 MariaDB 10 10 2 对应 MySQL 8 1 sqlite3 up
  • 1.Linux中超频及cpufreq相关汇总

    1 蛤蟆笔记UNIX高级编程 cpufreq相关汇总 其中一些内容摘自网络 xff0c 此处蛤蟆根据自己阅读习惯和理解进行了一些汇总整理 随着 energyefficient computing 和 performance per watt
  • 双尺度与多尺度图像细节提升 python matlab

    双尺度图像分解细节提升 一副图像经过大尺度的均值滤波 公式10 后得到大尺度的基础层Bn xff0c 然后用原图减去大尺度基础层 公式11 可以得到一副小尺度的细节层Dn xff0c 然后加上原图In xff0c 图像细节得到提升 xff0
  • WSL关闭与windows的互交互(解决PATH等环境变量问题

    如果在windows和wsl中都安装了nodejs 那么由于wsl的互交互特性 npm的运行就会不太正常 以下是禁用互交互的步骤 在WSL的终端中输入 span class token keyword echo span span clas
  • 数据结构——树

    1 树的相关定义 xff08 1 xff09 树 xff1a 包含n xff08 n gt 0 xff09 个节点的有穷集合 xff0c 其中每个元素称为节点 xff08 node xff09 xff1b 有一个特定的节点被称为根节点或树根
  • Qt QImage图片透明设置(Thinkvd开发日志)

    开发Thinkvd中的player 设置透明度用的是sdl来实现的 xff0c 转换中的水印用的是png 如何设置水印的透明度 xff0c 实际上要求把图片转换成带alpha的32位即可 实现代码 xff1a 8 void ImageCom
  • 关于 win10 系统安装Geomagic Wrap 2017导致一直蓝屏重启解决方案

    学校进行专业实训 xff0c 开了一门3D打印的课程 老师要求下载Geomagic Wrap 2017 xff0c 但是凡是win10系统安装的人都出现了不同程度的蓝屏 xff0c 我的电脑更是一直蓝屏重启 xff0c 网上找了很多方法 x
  • 八数码问题完全版-是否可解判断及求解

    八数码问题 有一个3 3的棋盘 xff0c 其中有0 8 9个数字 xff0c 0表示空格 xff0c 其他的数字可以和0交换位置 求由初始状态 1 2 3 4 5 6 7 8 0 到达目标状态步数最少的解 其典型算法是广度优先搜索 xff
  • windows10-conda cmd使用时错误:‘conda‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件

    在 windows10 上装完 conda 之后 xff0c 打开 cmd 想看看 conda 的版本 xff0c 结果找不到 xff0c 于是走上了解决之路 xff0c 并做个简单的记录 错误截图 问题原因 系统 path 环境没有进行设
  • Linux下安装Qt 6

    在Linux平台下 xff0c 安装Qt xff0c 与Windows基本一致 xff0c 都是Qt在线图形化安装界面 xff0c 但是有一点不同 xff0c 需要前期环境准备 安装必需环境 Linux 的 Qt 安装程序假定主机操作系统提
  • 51单片机的中断系统及编程(附案例)

    本文简单粗暴地阐述了中断的一些概念 中断源 中断寄存器各位的作用 xff0c 并写出了编写一个中断函数的流程 要点 不在意细节时 xff0c 可直接查看照搬 三 中断程序的编程 一 中断概念 中断定义 xff08 比喻 xff09 xff1
  • error C2143: 语法错误 : 缺少“;”(在“类型”的前面)

    在visual studio 中 xff0c 出现 xff1a error C2143 语法错误 缺少 在 类型 的前面 这是因为该编译器要求把变量定义在函数空间或者局部空间前面 xff0c 不能随便定义 如 xff1a int n sca
  • SolidWorks 3D草图扫描

    SolidWorks 3D草图扫描需要注意的是 xff1a 如果路径是3d草图画的 xff0c 则轮廓也需要用3d草图功能画 xff0c 且路径和轮廓要分别画在两个草图中
  • 字典排序法

    原理见 点击打开链接 http wenku baidu com link url 61 NrIeFmVNamnb5jXvYAxfJ3cAW0gwXcO0YkFx mBqoDwvvQyVAPNlzogg0FHs3GXPzBC3g2jg4Wzx
  • 树莓派3(raspberry pi 3B)gpsd不能工作问题

    1 问题描述在这里面有 xff1a https www raspberrypi org forums viewtopic php f 61 28 amp t 61 138711 2 在这个帖子里面 xff0c 作者给出了解决方案 xff1a
  • (转) 深度学习在目标跟踪中的应用

    深度学习在目标跟踪中的应用 原创 2016 09 05 徐霞清 深度学习大讲堂 点击上方 深度学习大讲堂 可订阅哦 xff01 深度学习大讲堂是高质量原创内容的平台 xff0c 邀请学术界 工业界一线专家撰稿 xff0c 致力于推送人工智能
  • 树莓派3B+gpsd 3.16不能开机后自动启动问题

    自上一篇帖子通过编译gpsd3 16版本解决gpsd 3 11在树莓派上不能工作问题后 xff0c 想配置gpsd 3 16自动启动 但是经过不停的尝试 xff0c 发现还是不能成功自启 xff0c 在这过程中发现了一篇学习文档 xff1a
  • 关于CWinApp::OnIdle的解释

    CWinApp OnIdle virtual BOOL OnIdle LONG lCount 返回值 xff1a 如果要接收更多的空闲处理时间 xff0c 则返回非零值 xff1b 如果不需要更多的空闲时间则返回0 参数 xff1a lCo
  • vmware-ubuntu 基本操作

    最近学习了ubuntu虚拟机的使用 xff0c 开始安装就花费了很长时间 xff0c 安装好后自己对一个全新的系统很陌生 xff0c 于是在网上查资料找到了它的一些终端基本的命令 xff0c 先从基础开始 一 打开终端的几种方法 1 快捷键
  • Dockerfile创建详解

    Docker Dockerfile 什么是 Dockerfile xff1f Dockerfile 是一个用来构建镜像的文本文件 xff0c 文本内容包含了一条条构建镜像所需的指令和说明 使用 Dockerfile 定制镜像 这里仅讲解如何