欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 财经 > 产业 > docker-Dockerfile

docker-Dockerfile

2025/5/15 22:15:19 来源:https://blog.csdn.net/admin_233/article/details/143369071  浏览:    关键词:docker-Dockerfile

文章目录

  • 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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词