Dockerfile文件解释

2023-05-16

一、先来看一个简单的 Dockerfile

#这个Dockerfile作用是打一个python3项目环境 
FROM python:3-alpine 
WORKDIR /app 
ADD . /app 
RUN pip3 install -r requirements.txt -i https://pypi.douban.com/simple 
CMD ["python3", "main.py"] 

#这个Dockerfile作用Dockerfile部署django项目 
FROM centos:7 
MAINTAINER annlin 
ADD requeriments.txt /home 
WORKDIR /home 
RUN yum update && yum -y install mysql && yum -y install python3-pip && pip3 install -r requirements.txt 
ADD autoTest /home/ WORKDIR /home/autoTest 
EXPOSE 8000 
ENTRYPOINT uwsgi --ini uwsgi.ini

二、Dockerfile 编写规则

  1. 指令大小写不敏感,为了区分习惯上用大写
  2. Dockerfile 非注释行第一行必须是 FROM
  3. 文件名必须是 Dockerfile
  4. Dockerfile 指定一个专门的目录为工作空间
  5. 所有引入映射的文件必须在这个工作空间目录下
  6. Dockerfile 工作空间目录下支持隐藏文件(.dockeringore)
  7. (.dockeringore)作用是用于存放不需要打包导入镜像的文件,根目录就是工作空间目录
  8. 每一条指令都会生成一个镜像层,镜像层多了执行效率就慢,能写成一条指定的就写成一条

三、Dockerfile 指令详解

1、FROM:基础镜像

1.1、FROM是Dockerfile文件开篇第一个非注释行代码

1.2、用于为镜像文件构建过程指定基础镜像,后续的指令都基于该基础镜像环境运行

1.3、基础镜像可以是任何一个镜像文件

1.4、docker build 会在docker宿主机上查找指定的文件,如未找到会自动去Docker Hub Registry上拉取

1.5、如果没找到对应的镜像就会返回错误信息

2、MAINTAINER:镜像作者信息

2.1、废弃了,使用LABLE替代

3、LABLE:镜像描述信息

3.1、LABLE author="annlin"

4、COPY:从 Docker 宿主机复制文件至创建的新镜像文件

4.1、COPY <src> <dest>

4.2、COPY ["<src>",.... "<dest>"]

4.3、<src>:要复制的源文件或目录,支持使用通配符

     1、<src>必须是build上下文中的路径,不能是其父目录路径

     2、如果<src>是目录,则其内部文件和子目录都会被递归复制,但是<src>目录本身不

        会被复制

     3、如果指定了多个<src>,或者<src>中使用了通配符,则<dest>必须是一个目录,

        且必须以/结尾

4.4、<dest>:目标路径,即正在创建的images的文件系统路径

     1、建议使用绝对路径,否则COPY指定以WORKDIR为其实路径

     2、如果<dest>不存在,将会被自动创建,包括其父目录路径一起创建

4.5、复制文件 COPY testFile /mnt

4.6、复制目录 COPY testDir /mnt/testDir

     1、testDir下所有文件和目录都会被递归复制

     2、目标路径要写testDir,否则会复制到/mnt下

5、ADD:类似于 COPY 指令,ADD 支持 tar 文件和 URL 路径​​​​​​​​​​​​​​

5.1、ADD <src> <dest>

5.2、ADD ["<src>",.... "<dest>"]

5.3、如果<src>为URL切<dest>不以/结尾,则<src>指定的文件将被下载并直接被创建为<fimename>,如果<dest>以/结尾,则文件名URL指定的文件将被下载并保存为<dest>/fimename

5.4、如果<src>是一个压缩文件(tar),会被解压为一个目录,但是通过URL下载的tar文件不会被解压

5.5、如果是多个<src>,或者是同一个<src>使用了通配符,则<dest>必须是以/结尾的目录,如果<dest>不以/结尾,则<src>会被作为一个普通文件,<src>内容讲被写入到<dest>

6、WORKDIR:用于为 Dockerfile 中所有的 RUN、CMD、ENTRYPOINT、COPY、ADD 指定设定工作目录

6.1、WORKDIR /mnt,如果目录不存在会自动创建,包括他的父目录

6.2、一个Dockerfile中WORKDIR可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR路径

6.3、WORKDIR也可以调用ENV指定的变量

6.4:举例 from python:latest workdir /mnt run touch a.txt workdir /usr run touch b.txt

7、VOLUME:数据卷,用于在 image 中创建挂载点目录,以挂载 Docker host 上的卷或者其他容器上的卷

7.1、VOLUM mount_point

7.2、VOLUM ["mount_point1","mount_point2"]

7.3、如果挂载点目录下有文件存在,docker run命令会在卷挂载完成后将所有文件复制到容器中

8、EXPOSE:为容器打开指定的监听端口以实现与外部通信

8.1、EXPOSE <port> </portocol>

     1、<port>:端口号

     2、</portocol>:协议类型,默认为TCP协议 EXPOSE 8080/tcp 8081/udp

8.2、不会直接对外暴露这里的端口,只有在run的时候加上-P(大写)才会将EXPOSE的端口暴露出去

9、ENV:用于为镜像定义所需的环境变量,可以被 Dockerfile 文件中其他命令调用(ENV、ADD、COPY、RUN、CMD)

9.1、ENV key value 1、key之后的所有内容都会被视为value,因此,一次只能设置一个变量

9.2、ENV key=value

     1、可以设置多个变量,每个key=value键值对为一个变量

     2、如果value中包含空格需要用反斜杠转义,也可以对value加引号进行标识,反斜杠也可以用于续行

9.3、调用格式:$variable_name 或 ${variable_name}

9.4、定义多个变量建议使用第二种方式,以便在同一层中完成

9.5、举例 ENV DOC_DIR=/mnt/doc COPY index.html ${DOC_DIR:-/mnt/doc} #-:如果DOC_DIR不存在则使用-后面的默认值 #+:如果DOC_DIR存在则使用+后面的值

10、RUN:docker build 镜像构建的时候需要执行的 shell 命令默认"/bin/sh -c"运行 

10.1、docker build过程中需要执行的命令

10.2、RUN是在镜像构建完成之后运行结束

10.3、RUN执行的命令只能基于基础镜像的命令,执行之前先要确定基础镜像是否有该命令

10.4、一个Dockerfile可以写多个RUN

   语法一、RUN command1 && command2....

     1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程

     2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到

     3、RUN echo "test_demo" > a.txt 此时可以使用shell特性

   语法二、RUN ["executable","param1","param2"]

     1、executable为要运行的命令

     2、param1为命令运行的参数

     3、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)

     4、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程 RUN ["/bin/bash","-c","executable","param1"]

     5、list中的参数要使用双引号

11、CMD:启动容器指定默认要运行的程序或命令,默认"/bin/sh -c"运行

11.1、docker run过程中需要执行的命令

11.2、CMD运行结束后容器就将终止

11.3、CMD指定的命令将可以被 docker run 最后面的命令覆盖

11.4、一个Dockerfile写多个CMD只有最后一个CMD会生效

   语法一、CMD command

     1、通常是shell命令且以"/bin/sh -c"来运行它,此时运行为shell的子进程,能使用shell操作符

     2、进程在容器中的PID!=1,不能接收unix信号,当使用docker stop 将无法接收到

     3、CMD /bin/httpd -f -h ${httpd} 此时在运行容器的时候加-it参数无法进入交互式模式,需要使用docker exec进入交互模式

   语法二、CMD ["executable","param1","param2"]

     1、不会以"/bin/sh -c"运行(非shell子进程),因此不支持shell操作符如变量替换和通配符(?,*等)

     2、如果运行命令需要依赖shell特性可以增加参数,手动启动为shell的子进程 CMD ["/bin/bash","-c","executable","param1","param2"](有问题,不能启动容器)

   语法三、CMD ["param1","param2"]

     1、需要结合ENTRYPOINT指令提供默认参数使用

12、ENTRYPOINT:类型 CMD 指令的功能,用于为容器指定默认运行程序或命令

12.1、与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序

12.2、docker run命令的 --entrypoint选项参数可以覆盖ENTRYPOINT指令指定的程序

12.3、一个Dockerfile中可以有多个ENTRYPOINT,但是只有最后一个会生效

12.4、ENTRYPOINT主要用于shell作为启动其他进程的父进程,后面跟的参数被当成子进程来启动

   语法一:ENTRYPOINT command

   语法二:ENTRYPOINT ["/bin/bash","param1","param2"]

13、CMD 和 ENTRYPOINT 同时存在 Dockerfile 中

13.1、CMD的值会当做参数传递给ENTRYPOINT

13.2、实现使用shell子进程启动httpd

13.3、如果docker run再传入参数,是传给ENTRYPOINT的,因为ENTRYPOINT有自己的参数,此时CMD参数会被ducker run后面跟的参数覆盖,并不是覆盖ENTRYPOINT的参数,要覆盖ENTRYPOINT的参数需要使用--entrypoint选项 CMD ["/bin/httpd/","-f"] ENTRYPOINT /bin/bash -c -h 通过传参启动容器 FROM python:latest LABLE auth="haili" ENV NGX_DOC_ROOT='/data/web/html' ADD entrypoint.sh /bin/ CMD ['/usr/sbin/nginx','-g','daemon off;'] ENTRYPOINT ['/bin/sh','-c','/bin/entrypoint.sh']

    1、先执行ENTRYPOINT,然后讲CMD的值当做参数传给ENTRYPOINT进行执行

14、USER:指定运行 image 时和 Dockerfile 中任何 RUN、CMD、ENTRYPOINT 指令指定的程序的用户

14.1、使用用户名或者UID

14.2、默认情况下container的运行身份为root用户

14.3、USER UID | user_name

14.4、UID 和 user_name必须存在/etc/passwd当中,否则会报错

15、HEALTHCHECK:健康检查,定义一个命令用于检查主进程工作状态是否健康

15.1、HEALTHCHECK参数

     1、--interval=DURATION(default 30s) 健康检查间隔时间

     2、--timeout=DURATION(default 30s) 超时时间

     3、--start-period=DURATION(default 0s) 容器启动多久后执行健康检查

     4、--retries=N(default 30s) 检测次数

15.2、检查结果 0:成功 1:失败 2:预留字段

15.3、举例 HEALTHCHECK --interval=5m --timeout=5s CMD curl -f http://localhost:8080 ||exit1

16、SHELL:指定运行 RUN、CMD、ENTRYPOINT 的 shell 程序

17、STOPSIGNAL:给主进程发送信号

18、ARG:docker build 过程中的参数

18.1、定义pyton镜像作者,通过参数传入 FROM python ARG author="latest" LABLE author="${author}"

18.2、使用 docker build --build-arg author="haili"

18.3、常用在docker build 过程中替换参数

19、ONBUILD:用于在 Dockerfile 中定义一个触发器

19.1、Dockerfile1中加一个ONBUILD add file,当docker build -t=testpython Dockerfile1的时候ONBUILD指令不会被执行,Dockerfile2中FROM testpython(Dockerfile1构建后生成的镜像),当运行docker build -t=test Dockerfile2的时候Dockerfile1中的ONBUILD add file会被执行

19.2、Dockerfile用于build镜像文件,此镜像文件可以作为base image被另外一个Dockerfile作为FROM参数使用,并以之构建新的镜像文件

19.3、在后面这个Dockerfile中的FROM指令在build过程中被执行时,将触发创建其base image的Dockerfile中ONBUILD指定定义的触发器

19.4、尽管任何指令都可以注册为触发器指令,但是ONBUILD不能自我嵌套,且不会触发FROM和MAINTAINER指令

19.5、使用包含ONBUILD指令的Dockerfile构建镜像应该使用特殊标签如,python:1.0-onbuild

19.6、ONBUILD指令中使用ADD COPY指令要格外小心,因为新构建过程山下文缺少指定的源文件就会失败​​​​​​​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Dockerfile文件解释 的相关文章

随机推荐

  • OpenVINS与MSCKF_VIO RK4积分对比

    VIO系统在使用IMU测量值进行状态预测时 xff0c 需要将连续时间的微分方程离散化为差分方程 xff0c 离散化的本质是积分 xff0c 根据数值积分近似程度不同 xff0c 常用的有欧拉法 中点法和四阶龙格库塔法等 xff0c Ope
  • 全盘拷贝linux系统,转移至另一硬盘

    首先制作ubuntu启动盘 xff0c 选择try ubuntu进入live ubuntu系统 查看需拷贝硬盘盘符 span class token function sudo span span class token function
  • EKF SLAM

    EKF 方法是解决 SLAM 问题的一种经典方法 xff0c 其应用依赖于运动模型和观测模型的高斯噪声假设 在 SLAM 问题首次提出不久后 xff0c Smith 和 Cheesman 及 Durrant Whyte对机器人和路标间的几何
  • 如何将立创EDA中的元器件的原理图/封装和3D模型导入AD的库中

    如何将立创EDA中的元器件的原理图 封装和3D模型导入AD的库中 工具 xff1a AD 立创EDA专业版 fusion360 或其他3D软件 导入原理图 封装 在立创商城复制所需元器件的编号 打开立创EDA标准版或专业版 xff0c 这里
  • Xshell 提示 “要继续使用此程序,您必须应用最新的更新或使用新版本“的解决方案

    要想解决Xshell提示更新最新版问题 有两种方案 方案一 手动修改系统时间 步骤如下 右键右下角时间 弹出如下窗口 2 选中 调整日期 时间 A 并点击 弹出如下页面 更改时间 更改成之前的年份 如下图 更改成功后 再打开相应的应用 Xs
  • 2020.2.22 排位赛 G - Bucket Brigade(BFS)

    Bucket Brigade 题面 题目分析 BFS模板题 代码 span class token macro property span class token directive keyword include span span cl
  • Canal入门(二)

    Canal入门 xff08 二 xff09 canal kafka quickStart 1 基本说明 canal 1 1 1版本之后 默认支持将canal server接收到的binlog数据直接投递到MQ 目前默认支持的MQ系统有 ka
  • PID调节三个参数的作用

    1 比例调节作用 xff1a 按比例反应系统的偏差 系统一旦出现了偏差 比例调节立即产生调节作用用以减少偏差 比例作用大 可 以加快调节 能迅速反应误差 xff0c 从而减小稳态误差 但是 xff0c 比例控制不能消除稳态误差 过大的比例
  • (centos7)docker+jenkins运行python自动化

    目录 一 实现思路 二 环境准备 1 在liunx上安装docker 2 docker安装jenkins 三 访问前设置 四 配置jenkins容器 五 jenkins插件安装 1 安装git 2 安装docker 3 html Publi
  • OJ在线编程常见输入输出练习

    OJ在线编程常见输入输出练习 4 a 43 b 4 输入描述 xff1a 输入数据包括多组 每组数据一行 每行的第一个整数为整数的个数n 1 lt 61 n lt 61 100 n为0的时候结束输入 接下来n个正整数 即需要求和的每个正整数
  • js中数组与集合的相互转化

    数组 gt 集合 var a 61 1 2 3 4 5 5 var set 61 new Set a console log set 1 2 3 4 5 集合 gt 数组 var set 61 new Set set add 1 set a
  • Linux make/Makefile详解

    会不会写makefile xff0c 从侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数 xff0c 其按类型 功能 模块分别放在若干个目录中 xff0c makefile定义了一系列的 规则来指定 xff0c 哪些文件
  • 大疆H20系列吊舱,录制的视频含义

  • 写算法的方法

    写算法步骤 xff1a xff08 以下方法 xff0c 都是老生常谈 但是非常简单有用 xff09 数据结构 xff08 所有的算法都是基于数据结构的操作 所有算法都是针对数据结构的属性进行操作 列出所有的属性 xff0c 写算法逐项修改
  • Windows系统下QT+OpenCasCAD仿真开发

    背景 最近开发了一个六自由度机械臂调姿平台的控制软件 xff0c 集成了API激光跟踪仪和KUKA机器人 xff0c 实现了根据产品的测量位姿驱动仿真环境中模型并且实现模型间的碰撞检测 其中KUKA机器人的控制可以参考笔者以前的博客 xff
  • 飞控IMU姿态估计流程

    飞控中使用加速度计 xff0c 陀螺仪 xff0c 磁罗盘进行姿态估计算法流程 step1 xff1a 获取陀螺仪 xff0c 加速度计 xff0c 磁罗盘的原始数值 step2 xff1a 陀螺仪 xff0c 加速度计减去固定的偏移后得到
  • 图拓扑关系可视化的qt实现

    前言 最近在做数据可视化的相关工作 xff0c 包括曲线图 xff0c 航迹图 xff0c 图结构 xff0c 树结构等 其中树结构相关的工作笔者以前曾经做过 xff0c 可以参考笔者以前的博客 qt自定义树形控件之一和qt自定义树形控件之
  • 基于qwt3D 的3D航迹图的实现

    前言 使用qt实现三维空间直角坐标系中的航迹实时绘制网上很难查到资料 在qt下实现3D绘图通常实现方式有OpenGL VTK qwt3d QtDataVisualization等 Qcharts QCustomPlot只支持2D绘图 这里给
  • 树莓派4b连接RealSense T265

    使用的是树莓派4 8G版本 准备连接RealSense T265的双目相机 T265目前官方编译好的的只有Ubuntu16和18 其他的系统版本需要自己编译realsense驱动 安装ubuntu20 10 https ubuntu com
  • Dockerfile文件解释

    一 先来看一个简单的 Dockerfile 这个Dockerfile作用是打一个python3项目环境 FROM python 3 alpine WORKDIR app ADD app RUN pip3 install r requirem