响应式网站开发需要的条件,何炅做的网站广告,wordpress百度翻译,阳江网约车♥ 前 言
前言#xff1a;近年来 Docker 非常火#xff0c;想要玩好 Docker 的话 Dockerfile 是绕不开的#xff0c;这就好比想要玩好 Linux 服务器绕不开 shell 道理是一样的。今天我们就来聊一聊 Dockerfile 怎么写#xff0c;那些指令到底是什么意思。
一、先来看一…♥ 前 言
前言近年来 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_from333.337vd_source488d25e59e6c5b111f7a1a1a16ecbe9a
二、Dockerfile 编写规则 指令大小写不敏感为了区分习惯上用大写 Dockerfile 非注释行第一行必须是 FROM 文件名必须是 Dockerfile Dockerfile 指定一个专门的目录为工作空间 所有引入映射的文件必须在这个工作空间目录下 Dockerfile 工作空间目录下支持隐藏文件(.dockeringore) (.dockeringore)作用是用于存放不需要打包导入镜像的文件根目录就是工作空间目录 每一条指令都会生成一个镜像层镜像层多了执行效率就慢能写成一条指定的就写成一条
三、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 authorhaili
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/testDir1、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:latestworkdir /mntrun touch a.txtworkdir /usrrun 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 /portocol1、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 value1、key之后的所有内容都会被视为value,因此一次只能设置一个变量
9.2、ENV keyvalue1、可以设置多个变量每个keyvalue键值对为一个变量2、如果value中包含空格需要用反斜杠转义也可以对value加引号进行标识反斜杠也可以用于续行
9.3、调用格式$variable_name 或 ${variable_name}
9.4、定义多个变量建议使用第二种方式以便在同一层中完成
9.5、举例ENV DOC_DIR/mnt/docCOPY index.html ${DOC_DIR:-/mnt/doc} #-如果DOC_DIR不存在则使用-后面的默认值#如果DOC_DIR存在则使用后面的值
10.RUNdocker 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,param1param2]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 command1、通常是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:latestLABLE authhailiENV NGX_DOC_ROOT/data/web/htmlADD 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、--intervalDURATION(default 30s) 健康检查间隔时间2、--timeoutDURATION(default 30s) 超时时间3、--start-periodDURATION(default 0s) 容器启动多久后执行健康检查4、--retriesN(default 30s) 检测次数
15.2、检查结果0成功1失败2预留字段15.3、举例HEALTHCHECK --interval5m --timeout5s CMD curl -f http://localhost:8080 ||exit1
16.SHELL指定运行 RUN、CMD、ENTRYPOINT 的 shell 程序
17.OPSIGNAL给主进程发送信号
18.ARGdocker build 过程中的参数 18.1、定义pyton镜像作者通过参数传入FROM pythonARG authorlatestLABLE author${author}18.2、使用docker build --build-arg authorhaili18.3、常用在docker build 过程中替换参数
19.ONBUILD用于在 Dockerfile 中定义一个触发器
19.1、Dockerfile1中加一个ONBUILD add file当docker build -ttestpython Dockerfile1的时候ONBUILD指令不会被执行,Dockerfile2中FROM testpython(Dockerfile1构建后生成的镜像)当运行docker build -ttest 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指令要格外小心因为新构建过程山下文缺少指定的源文件就会