Docker 大热,还不了解 Dockerfile 你就OUT啦~

news2024/11/25 20:20:45

♥  前  言

前言:近年来 Docker 非常火,想要玩好 Docker 的话 Dockerfile 是绕不开的,这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。今天我们就来聊一聊 Dockerfile 怎么写,那些指令到底是什么意思。

一、先来看一个简单的 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 haili
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

如果你想学习自动化测试,我这边给你推荐一套视频,这个视频可以说是B站播放全网第一的接口自动化测试教程,同时在线人数到达1000人,并且还有笔记可以领取及各路大神技术交流:798478386      

【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)_哔哩哔哩_bilibili【已更新】B站讲的最详细的Python接口自动化测试实战教程全集(实战最新版)共计200条视频,包括:1.【接口自动化】目前软件测试的市场行情以及测试人员能力标准。、2.【接口自动化】全面熟练Requests库以及底层方法调用逻辑、3.【接口自动化】接口自动化实战及正则和JsonPath提取器的应用等,UP主更多精彩视频,请关注UP账号。https://www.bilibili.com/video/BV17p4y1B77x/?spm_id_from=333.337&vd_source=488d25e59e6c5b111f7a1a1a16ecbe9a 

二、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="haili"

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 指令的功能,用于为容器指定默认运行程序或命令
1、与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序
2、docker run命令的 --entrypoint选项参数可以覆盖ENTRYPOINT指令指定的程序
3、一个Dockerfile中可以有多个ENTRYPOINT,但是只有最后一个会生效
4、ENTRYPOINT主要用于shell作为启动其他进程的父进程,后面跟的参数被当成子进程来启动
    语法一:ENTRYPOINT command
    语法二:ENTRYPOINT  ["/bin/bash","param1","param2"]

13.CMD 和 ENTRYPOINT 同时存在 Dockerfile 中

1、CMD的值会当做参数传递给ENTRYPOINT
2、实现使用shell子进程启动httpd
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 指令指定的程序的用户

1、使用用户名或者UID
2、默认情况下container的运行身份为root用户
3、USER UID | user_name
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.OPSIGNAL:给主进程发送信号
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指令要格外小心,因为新构建过程山下文缺少指定的源文件就会

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/865348.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NIDS网络威胁检测系统-Golang

使用技术&#xff1a; Golang Gin框架 前端三件套 演示画面&#xff1a; 可以部署在linux和window上 目前已在Kali2021和Window10上进行测试成功

openGauss学习笔记-37 openGauss 高级数据管理-事务

文章目录 openGauss学习笔记-37 openGauss 高级数据管理-事务37.1 语法格式37.2 参数说明37.3 示例 openGauss学习笔记-37 openGauss 高级数据管理-事务 事务是用户定义的一个数据库操作序列&#xff0c;这些操作要么全做要么全不做&#xff0c;是一个不可分割的工作单位。ope…

IntelliJ中文乱码问题

1、控制台乱码 运行时控制台输出的中文为乱码&#xff0c;解决方法&#xff1a;帮助 > 编辑自定义虚拟机选项… > 此时会自动创建出一个新文件&#xff0c;输入&#xff1a;-Dfile.encodingUTF-8&#xff0c;然后重启IDE即可&#xff0c;操作截图如下&#xff1a; 2、…

微服务05-Sentinel流量防卫兵

随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件,主要以 流量 为切入点,从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 S…

LightningChart JS 2023Crack,CPU高效实时更新

LightningChart JS 2023Crack,CPU高效实时更新 添加了新的极地热图图表类型-添加了新系列类型&#xff0c;允许您在极地坐标系中可视化热图。极地热图的一些关键特征是&#xff1a; 处理多达400万个数据点。 快速加载速度和CPU高效实时更新。 100ms以完全显示由所有数据填充的热…

软件测试面试题——如何测试App性能?

为什么要做App性能测试&#xff1f; 如果APP总是出现卡顿或网络延迟的情况&#xff0c;降低了用户的好感&#xff0c;用户可能会抛弃该App&#xff0c;换同类型的其他应用。如果APP的性能较好&#xff0c;用户体验高&#xff0c;使用起来丝滑顺畅&#xff0c;那该应用的用户粘…

Oracle数据库中的CLOB字段类型,映射到Map<String,Object>中异常问题解决

数据库中的某个字段是CLOB类型的&#xff0c;我在查询某个SQL的时候&#xff0c;用Map<String&#xff0c;Object>来接。就会报错。 解决办法&#xff1a; 创建一个自定义处理类&#xff1a; MappedTypes 定义的是 JavaType 类型&#xff0c;可以指定哪些 Java 类型被…

DARPA TC-e3/e5数据集bin转json

关于这个数据集的一些基本信息就不赘述了&#xff0c;参考我之前的博客。DARPA TC-engagement5数据集官方工具可视化 两个方法&#xff1a;修改ELK可视化工具或直接使用自带的工具。前者相对灵活&#xff0c;因为losgstash可以通过配置过滤器来修改字段&#xff1b;可以通过out…

【论文阅读】基于深度学习的时序预测——Non-stationary Transformers

系列文章链接 论文一&#xff1a;2020 Informer&#xff1a;长时序数据预测 论文二&#xff1a;2021 Autoformer&#xff1a;长序列数据预测 论文三&#xff1a;2022 FEDformer&#xff1a;长序列数据预测 论文四&#xff1a;2022 Non-Stationary Transformers&#xff1a;非平…

配置docker和复现

1.Nginx环境搭建 选择centos7来进行安装 1.1 创建Nginx的目录并进入 mkdir /soft && mkdir /soft/nginx/ cd /soft/nginx/ 1.2 下载Nginx的安装包&#xff0c;可以通过FTP工具上传离线环境包&#xff0c;或者通过wget命令在线获取安装包 wget https://nginx.org/down…

web后端解决跨域问题

目录 什么是跨域问题 为什么限制访问 解决 什么是跨域问题 域是指从一个域名的网页去请求另一个域名的资源。比如从www.baidu.com 页面去请求 www.google.com 的资源。但是一般情况下不能这么做&#xff0c;它是由浏览器的同源策略造成的&#xff0c;是浏览器对js施加的安全…

vue svg画渐变色线条

基于业务需求需要&#xff0c;需要使用svg画渐变色弧线并且采用虚线。并且封装成组件。 一、path路径 path路径是svg中最强大的图形&#xff0c;可以绘制各种svg所有能画的图形。 路径中的线是由d属性来绘制&#xff0c;属性参数由各种命令组成&#xff0c;以下是它的基本命…

解锁Python集合的妙用:常用函数与实例深度解析

Python的集合&#xff08;Set&#xff09;是一种无序且不重复的数据结构&#xff0c;拥有强大的去重和集合运算功能。在这篇博客中&#xff0c;我们将深入探讨集合的常用函数&#xff0c;并通过实际案例为你展示其灵活应用。 创建集合​ 集合可以通过花括号来创建&#xff0c…

[数据分析与可视化] Python绘制数据地图5-MovingPandas绘图实例

MovingPandas是一个基于Python和GeoPandas的开源地理时空数据处理库&#xff0c;用于处理移动物体的轨迹数据。关于MovingPandas的使用见文章&#xff1a;MovingPandas入门指北&#xff0c;本文主要介绍三个MovingPandas的绘图实例。 MovingPandas官方仓库地址为&#xff1a;mo…

地理测绘基础知识(1) 坐标系经纬度与ECEF直角坐标的基本换算

经纬度与ECEF直角坐标的基本换算 我们目前最常用的全球坐标系是WGS-84坐标系&#xff0c;各种手机、地图基本用经纬度来标记位置。然而&#xff0c;经纬度对于空间的计算是很复杂的&#xff0c;需要很多三角函数操作。平面直角坐标系利用向量的运算&#xff0c;可以非常方便的…

【24择校指南】北方工业大学计算机考研考情分析

北方工业大学(B-) 考研难度&#xff08;☆☆&#xff09; 内容&#xff1a;23考情概况&#xff08;拟录取和复试分数人数统计&#xff09;、院校概况、23专业目录、23复试详情、23各科目和各专业考情分析。 正文1720字&#xff0c;预计阅读&#xff1a;5分钟。 2023考情概况…

UGUI基础游戏对象Canvas

一.画布Canvas对象概述 画布是一种带有画布组件的游戏对象&#xff0c;所有 UI 元素都必须是此类画布的子项。 创建新的 UI 元素&#xff08;如使用菜单 GameObject > UI > Image 创建图像&#xff09;时&#xff0c;如果场景中还没有画布&#xff0c;则会自动创建画布。…

在安装 ONLYOFFICE 协作空间社区版时如何使用额外脚本参数

ONLYOFFICE 协作空间社区版是免费的文档中心工具&#xff0c;可帮助您将用户与文档聚合至同一处&#xff0c;提高协作效率。 ONLYOFFICE 协作空间主要功能 使用 ONLYOFFICE 协作空间&#xff0c;您可以&#xff1a; 邀请他人&#xff0c;协作和沟通完成工作创建协作房间&…

React(5)

1.受控组件案例 1.1之前的影院案例改写 import React, { Component } from react import axios from axios import BetterScroll from better-scroll import ./css/02_tab.cssexport default class Cinema extends Component {constructor() {super();this.state {cinemaLis…

谈谈闭包和闭包使用场景

一、什么是闭包 概念&#xff1a;闭包还是作用域的一种特殊应用 二、触发闭包的情况 1.函数当做返回值被返回 2.函数当做参数被传递 3.自执行匿名函数 //情况1&#xff1a;函数当做返回值被返回 function fn(){const a 1;return function(){console.log(a) //1}; } const a …