首页 > 其他分享 >Dockerfile学习

Dockerfile学习

时间:2024-09-09 12:02:34浏览次数:8  
标签:RUN CMD 指定 学习 指令 格式 镜像 Dockerfile

1、Dockerfile 基本命令

FROM 指定基础镜像
RUN 执行命令
COPY 复制文件
ADD 更高级的复制文件
CMD 用于指定容器启动时要运行的默认命令
ENTRYPOINT 容器运行过程的起点
ENV 设置环境变量
ARG 用于指定容器启动时要运行的默认命令
VOLUME 定义匿名卷
EXPOSE 需要暴露的端口
WORKDIR 指定工作目录
USER 指定当前用户
HEALTHCHECK 定义健康检查
ONBUILD 为镜像添加触发器
LABEL 添加元数据标签
STOPSIGNAL 停止容器时发送的信号 
SHELL 指定在执行RUN、CMD和ENTRYPOINT指令时使用的shell解释器

注意:

Dockerfile 的指令每执行一次都会在 docker 上新建一层。所以过多无意义的层,会造成镜像膨胀过大。

FROM 指定基础镜像

FROM 指令用于指定其后构建新镜像所使用的基础镜像。FROM 指令必是 Dockerfile 文件中的首条命令,启动构建流程后,Docker 将会基于该镜像构建新镜像,FROM 后的命令也会基于这个基础镜像。

语法格式如下:

FROM <image>
# 或
FROM <image>:<tag>
# 或
FROM <image>:<digest>

FROM 有以下限制:

1、FROM 必须 是 Dockerfile 中第一条非注释命令。

2、在一个 Dockerfile 文件中创建多个镜像时,FROM 可以多次出现。只需在每个新命令 FROM 之前,记录提交上次的镜像 ID。

3、tag 或 digest 是可选的,如果不使用这两个值时,会使用 latest 版本的基础镜像。

RUN 执行命令

RUN 指令在镜像的构建过程中执行特定的命令,并生成一个中间镜像。

RUN 命令将在当前 image 中执行任意合法命令并提交执行结果。命令执行提交后,就会自动执行 Dockerfile 中的下一个指令。

RUN 指令创建的中间镜像会被缓存,并会在下次构建中使用。如果不想使用这些缓存镜像,可以在构建时指定 --no-cache 参数,如:docker build --no-cache

语法格式如下(有两种格式):

1、RUN <命令行命令>
# <命令行命令> 等同于,在终端操作的 shell 命令。

2、RUN ["可执行文件", "参数1", "参数2"]
# 例如:
# RUN ["./test.php", "dev", "offline"] 等价于 RUN ./test.php dev offline

COPY 复制文件

复制指令,从上下文目录中复制文件或者目录到容器里指定路径。

指令从 <源路径1> 复制新的文件或目录,并将它们添加到 Docker 容器文件系统的 <目标路径> 的路径下。

语法格式如下:

COPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]

参数说明:
1、[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。
2、<目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
3、<源路径>:源文件或者源目录,这里可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。例如
	COPY hom* /mydir/
	COPY hom?.txt /mydir/

ADD 指令和 COPY 指令的格式和性质基本一致,但是在 COPY 基础上增加了一些功能。

1、ADD指令可以让你使用 URL 作为 <源路径1> 参数。当遇到 URL 时候,可以通过 URL 下载文件并且复制到 <目标路径>(容器中目标路径)。
2、ADD的另一个特性是自动解压文件的能力。如果 <源路径1> 参数是一个可识别压缩格式(tar, gzip, bzip2…)的本地文件(注:无法实现同时下载并解压),就会被解压到指定容器文件系统的路径 <目标路径> 下。

CMD

类似于 RUN 指令,用于运行程序,但二者运行的时间点不同:

CMD 在 docker run 时运行,在构建时不进行任何操作。如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效。

RUN 是在 docker build,并生成一个新的镜像。

语法格式如下(有三种格式):

CMD <shell 命令> 

CMD ["<可执行文件或命令>","<param1>","<param2>",...] 

CMD ["<param1>","<param2>",...]  # 该写法是为 ENTRYPOINT 指令指定的程序提供默认参数

推荐使用第二种格式,执行过程比较明确。第一种格式实际上在运行的过程中也会自动转换成第二种格式运行,并且默认可执行文件是sh。

ENTRYPOINT

ENTRYPOINT 用于给容器配置一个可执行程序。也就是说,每次使用镜像创建容器时,通过 ENTRYPOINT 指定的程序都会被设置为默认程序。

类似于 CMD 指令,但其不会被 docker run 的命令行参数指定的指令所覆盖,而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序。

但是,如果运行 docker run 时使用了 --entrypoint 选项,将覆盖 ENTRYPOINT 指令指定的程序。

优点:在执行 docker run 的时候可以指定 ENTRYPOINT 运行所需的参数。

注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。

语法格式如下:

ENTRYPOINT ["<executeable>","<param1>","<param2>",...]
可以搭配 CMD 命令使用:一般是变参才会使用 CMD ,这里的 CMD 等于是在给 ENTRYPOINT 传参。

ENV 设置环境变量

设置环境变量,定义了环境变量,那么在后续的指令中,就可以使用这个环境变量。

语法格式如下(有两种格式):

ENV <key> <value>

ENV <key1>=<value1> <key2>=<value2>...
这个指令很简单,就是设置环境变量而已,无论是后面的其它指令,如 RUN,还是运行时的应用,都可以直接使用这里定义的环境变量。

ENV VERSION=1.0 DEBUG=on \
    NAME="Happy Feet"

ARG

构建参数,与 ENV 作用一致。不过作用域不一样。ARG 设置的环境变量仅对 Dockerfile 内有效,也就是说只有 docker build 的过程中有效,构建好的镜像内不存在此环境变量。
构建命令 docker build 中可以用 --build-arg <参数名>=<值> 来覆盖。

语法格式如下:

ARG <参数名>[=<默认值>]

VOLUME 定义匿名卷

定义匿名数据卷。在启动容器时忘记挂载数据卷,会自动挂载到匿名卷。

EXPOSE

  • 为构建的镜像设置监听端口,使容器在运行时监听(仅仅只是声明端口)。
  • 作用:
    • 帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射。
    • 在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

语法格式如下:

EXPOSE <port> [<port>...]

WORKDIR 指定工作目录

指定工作目录。用 WORKDIR 指定的工作目录,会在构建镜像的每一层中都存在。以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
docker build 构建镜像过程中的,每一个 RUN 命令都是新建的一层。只有通过 WORKDIR 创建的目录才会一直存在。

语法格式如下:

WORKDIR <工作目录路径>

USER 指定当前用户

用于指定执行后续命令的用户和用户组,这边只是切换后续命令执行的用户(用户和用户组必须提前已经存在)。

语法格式如下:

USER <用户名>[:<用户组>]

HEALTHCHECK

用于指定某个程序或者指令来监控 docker 容器服务的运行状态。

语法格式如下:

HEALTHCHECK [选项] CMD <命令>:设置检查容器健康状况的命令
HEALTHCHECK NONE:如果基础镜像有健康检查指令,使用这行可以屏蔽掉其健康检查指令

HEALTHCHECK [选项] CMD <命令> : 这边 CMD 后面跟随的命令使用,可以参考 CMD 的用法。

https://blog.csdn.net/m0_51913750/article/details/131563704

标签:RUN,CMD,指定,学习,指令,格式,镜像,Dockerfile
From: https://www.cnblogs.com/luxiaojun/p/18404301

相关文章

  • 嵌入式学习路线+嵌入式校招建议 嵌入式学习面试规划
    随着物联网、人工智能以及5G等技术的迅猛发展,嵌入式系统的需求逐渐增多。作为毕业生,如何制定一个合理的学习路线,以确保在找工作、参加校招时有足够的竞争力,是非常重要的。我会为你提供一个更加详细、系统的学习路线建议,帮助你避免迷失方向。一、初级阶段——基础入门目标......
  • 基于django+Python的考研学习系统的设计与实现
    前言......
  • 中移ML307R(4G Cat1,C-SDK,OpenCPU)模组学习开发-使用i2c采集sht30温湿度数据
    <p><iframename="ifd"src="https://mnifdv.cn/resource/cnblogs/ML307R_OPEN"frameborder="0"scrolling="auto"width="100%"height="1500"></iframe></p>  测试1,把文件拷贝到自己工程的 ......
  • 并发编程学习笔记2
    1.常见方法join作用:当某一线程调用该方法时,程序会等待该线程运行结束再执行后续代码例如@Slf4jpublicclasstest1{publicstaticvoidmain(String[]args)throwsInterruptedException{Runnabler=()->{log.info("begin");......
  • C++学习笔记(曾经我看不懂的代码2:基于范围的for循环、auto使用、stl容器、template模
    不知不觉c++程序设计:标准库已经看了一大半了,学到了很多,很多曾经在网上和在书上看到却看不懂的代码,在看完标准库中的大半内容以后,都能大致的理清代码的含义。代码模板一:for(auto&a:arr)1、基于范围的for循环:a为迭代变量,arr为迭代范围,&表示引用。写一个例子:#include<ios......
  • 卡码网学习系列-8.抽象类、继承、封装、多态
    抽象概念一些概念一些概念abstractclassAnimal{//具体实现的方法publicvoideat(){System.out.println("Theanimaliseating.");}//抽象方法publicabstractvoidmakeSound();}classDogextendsAnimal{//......
  • 【Python学习笔记】 第5章 数值类型
    数值类型基础知识在Python中,数值实际上是一种类型的分类,包括:整数、浮点数复数小数:固定精度对象分数:有理数对象集合:带有数值运算的集合体布尔值:True,False内置函数与块:round,math,random等表达式、无限制精度整数(很大的整数)、位运算、八进制、十二进制、......
  • 【JavaScript系列八】—讲述JS学习历程的知识分享!
    前言本篇主要讲述JS中较为重要的一环,函数的用法,深拷贝和浅拷贝的概念和区别,闭包和递归,包括一些案例:例如递归实现斐波那契数列,求阶乘等等一、关于函数定义函数的方式function关键字函数表达式(匿名函数)varfn=function(){}newfunction()函数的调用及其this指向普通函数—......
  • 【JavaScript系列九】—讲述JS学习历程的知识分享!
    前言本篇主要是讲述ES6的新增语法和相关运用一、ES6ES的全称是ECMAScript,它是由ECMA国际标准化组织,制定的一项脚本语言的标准化规范。泛指2015年6月之后发布的版本为什么使用ES6语言更加完善功能更加强大变量提升特性增加了程序运行时的不确定性语法过于......
  • 【Vue系列一】—Vue学习历程的知识分享!
    前言经过前面Js部分的学习和理解,我们已经掌握的差不多了,我们接下来学习目前前端框架中最易上手和理解的Vue2框架的基本使用和学习一、Vue框架的优点渐进式JS框架渐进式:可以只使用单独的一部分模块,由浅到深,由简单到复杂声明式渲染->组件系统->客户端路由->集中式......