文章目录
- Dockerfile 配置文件
- 概览
- 介绍
- 目的
- 作用
- 构建镜像
- commit
- build
- 常用指令
- FROM 基础镜像(必需,一个)
- MAINTAINER 描述(可选,一个)
- LABEL 标签(可选,多个)
- ENV 环境变量(多个)
- RUN
- ADD
- WORKDIR
- VOLUME
- EXPOSE
- CMD 与 ENTRYPOINT选其一
- CMD
- ENTRYPOINT
- 拓展指令
- ARG
- USER
- ONBUILD
- STOPSIGNAL
- HEALTHCHECK
Dockerfile 配置文件
概览
介绍
- Docker为我们提供的一个用于自定义构建镜像的一个配置文件
- 配置文件作用:描述如何构建一个对象
- 利用Docker提供的build命令,指定Dockerfile文件,就可以按照配置的内容将镜像构建出来
目的
- 作为开发者需要将自己开发好的项目打包成Docker镜像便于后面直接作为Docker容器运行
- 作为运维人员需要构建更精简的基础设施服务镜像,满足公司的需求以及尽可能减少冗余的功能占用过多的资原
作用
- 可以自定义镜像内容
- 构建公共基础挽像减少其他镜像配置
- 开源程序的快速部署
- 实现企业内部项目的快速交付
构建镜像
commit
基于一个现有的容器,构建一个新的镜像
命令:
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
例:
docker commit -a=“wolfcode” -m=“first image” centos7 mycentos:7
OPTIONS:
-a:镜像的作者
-c:使用Dockerfile指令来构建镜像
-m:提交时的描述
-p:在commit时智停容器
build
常用指令
FROM 基础镜像(必需,一个)
指定以什么镜像作为基础镜像,在改进项的是础之上构建新的镜像
如果不想以任何镜像作为基础:FROM scratch
语法:
FROM
FROM :
FROM :
以上为三种写法,后两者为指定具体版本,第一种则使用latest,也就是最新版
例如:
FROM openjdk:8
MAINTAINER 描述(可选,一个)
描述这个镜像的作者,以及联系方式(可选)
例如:
MAINTAINER wolfcodeliugang@wolfcode.cn
LABEL 标签(可选,多个)
为镜像设置标签,一个Dockerfile中可以配置多个LABEL
语法:
LABEL =
如:
LABEL “example.label”=“Example Label”
LABEL label-value=“LABEL”
LABEL version=“1.0.0”
LABEL description=“可以写成多行,使用\符号可l以拼接多行的value”
例如:
LABEL version=“1.0”
LABEL description=“这是我的第一个Dockerfile”
ENV 环境变量(多个)
设置容器的环境变量,可以设置多个
语法:
ENV
ENV = =…
两种语法的区别为第一种一次只能设置一个环境变量。第二种可以一次设置多个
例如:
ENV JAVA ENV dev
ENV APP NAME test-dockerfile
ENV JAVA ENV=dev APP NAME=test-dockerfile
RUN
构建境像的过程中要执行的shell命令
语法:
RUN
RUN [“executableFile”,“param1”,“param2”,“paramN”]
第一种写法就是直接写SheI即本即可
第二种写法类以函数调用,第一个数为可执行文件,后面的都是参数
例如:
RUN 1s -al
RUN mkdir /www/dockerfile/test
ADD
将主机中的指定文件复制到容器的目标位置
复制命令,把src的文件复制到镜像的dest位置,可以简单理解为cp命令
语法:
ADD
ADD [“”,“”]
例如:
ADD /www/wolfcode.cn/index.html /www/server
ADD [“/www/wolfcode.cn/index.html”,“/www/server”]
WORKDIR
设置容器内的工作目录,如果该目录不存在,那么会自己创建并进入该目录
例如:
WORKDIR /app
#在设置完工作目录后,执行pwd命令,打印的目录就是/app
RUN pwd
VOLUME
镜像数据卷绑定,将容器中指定的目录映射到主机中
注意这里只是创建了一个指向container内该路径的数据卷,如果定义了名字则为具名数据卷;
这里并没有进行挂载操作,dockerfile不允许在file中指定数据卷的挂载,数据卷的挂载需要在docker run命令中指定;
语法:以下三种写法都可
VOLUME [“
VOLUME
VOLUME
例如:
EXPOSE
该镜像运行容器后,需要暴露给外部的端口,但仅仅表示该容器想要暴露某些端口,并不会与主机端口有映射关系
如果想将容器暴露的端口与主机映射则需要使用-p或-P参数来映射,可以暴露多个端口
语法:
EXPOSE /<tcp/udp>
EXPOSE [/<tcp/udp>]
例如:
EXPOSE 8080/tcp
EXPOSE 8080/udp
CMD 与 ENTRYPOINT选其一
CMD和ENTRYPOINT选择其一即可,作用是描述镜像构建完成后,启动容器时默认执行的脚本
CMD
该镜像启动容时默认执行的命令或参数
语法:
CMD [“executable",“param1”,“param2”]
CMD [“param1”,“param2”]
CMD
以上为该命令的三种写法.第一、二两种部是可执行文件+参数的形式,第三种与普通Shell命令类似;另外数组内的参数必须使用双引号。
例如:
CMD ping 127.0.0.1
CMD[“sh”,“-c”,“ping 127.0.0.1”]
ENTRYPOINT
运行容器时的启动命令,感觉与CMD命令会很像,实际上还是有很大区别,筒单对比一下:
相同点:
在整个Dockerfile中只能设置一次,如果写了多次则只有最后一次生效
不同点:
ENTRYPOINT不会被运行容器时指定的命令(docker run)所覆盖,而CMD会被 docker run中的命令所覆盖
如果同时设置了这两个指令,且CMD仅仅是选项而不是参数,CMD中的内容会作为NTRYPOINT的参数(一般不这么做)
如果两个都是完整命令,那么只会执行最后一条
语法:
ENTRYPOINT [“executable”,“param1”,“param2”]
ENTRYPOINT command paraml param2
例如:
ENTRYPONINT ping 127.0.0.1
ENTRYPOINT [“sh”,“-c”,“ping 127.0.0.1”]
拓展指令
ARG
设置变量,在镜像/docker file中定义一个变量
当使用docker build命令构建镜像时,带上–build-arg =来指定参数值,如果该变量名在Dockerfile中不存在则会抛出一个警告
语法:
ARG [=]
例如:
ARG jdk=8 #定义变量
FROM openjdk:$jdk # 使用 $ 引用变量
若在构建时指定,则优先使用指定的,否则使用默认
docker build -t --build-arg jdk=11 # jdk由原来默认的 8 指定为 11
USER
设置容器的用户,可以是用户名或UID,如果容器设置了以daemon用户去运行,那么RUN、CMD和ENTRYPOINT都会以这个用户去运行
一定要先确定容器中有这个用户,并且拥有对应的操作权限。
语法:
USER
USER
例如:
RUN useradd testuser #提前添加好用户
USER testuser #表示后续容器(docker file)中所有执行命令的用户都是以testuser进行操作的
ONBUILD
表示在构建镜像时做某操作,不过不对当前Dockerf1le的镜像生效,而是对以当前Dockerfile镜像作为基础镜像的子镜像生效
语法:
ONBUILD [INSTRUCTION]
例:
当前镜像为A,设置了如下指令
ONBUILD RUN ls -al
镜像B:
FROM 镜像A
…
构建镜像B时,会执行ls -al命令
STOPSIGNAL
STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。
此信号可以是与内核的系统调用表中的位置匹配的有效无符号数,例如9,或SIGNAL格式的信号名,例如SSIGKILL。
默认的stop-signal是SIGTERM,在docker stop的时候会给容器内PID为1的进程发送这个signal,.通过–stop-signal可以设置自己需要的signal
主要的目的是为了让容器内的应用程序在接收到sigal之后可以先做一些事情,实现容器的平滑退出
如果不做任何处理,容器将在一段时间之后强制退出,会造成业务的强制中断,这个时间默认是10s
STOPSIGNAL
HEALTHCHECK
容器健康状况检查,可以指定周期检查容器当前的健康状况
该命令只能出现一次,如果有多次则只有最后一次生效。
语法:
HEALTHCHECK [OPTIONS] CMD command #在容器内部按照指定周明运行指定命令来检测容器健康状况
HEALTHCHECK NONE #取消在基础镜像
OPTIONS选项:
–interval=DURATION 两次检查的间隔时间,默认3Os
–timeout=DURATION 命令执行的超时时间,默认30s
–retries=N 当连续失败指定次数,容器会被认定为不健康,默认为3次
返回参数:
0:success=>健康状态
1:unhealthy=>不健康状态
2:reserved=>保留值
例如:
健康检查,每隔10s检查容器是否正常,每次不超过3s,并且如果失败了,最多不能超过5次
HEALTHCHECK --interval=10 --timeout=3 --retries=5 CMD ps-ef | grep java || exit 1