Dockerfile文件编写

目录

Dockerfile文件编写

1.什么是Dockerfile

2. Dockerfile作用

3.dockerfile 的基本结构:

4.dockerfile指令:

FROM  指定基础镜像,dockerfile构建镜像的第一个指令

LABEL  指定镜像维护人信息

ADD/COPY 复制本地文件/目录到镜像中

RUN 指定Linux命令,建议多个命令用 && 或 ; 串起来使用

ENV 设置镜像环境变量

EXPOSE 暴露容器端口

VOLUME 指定容器的匿名数据卷

USER  指定容器运行用户

WORKDIR  指定镜像的工作目录

ARG 指定构建镜像时传入的参数

CMD/ENTRYPOINT  指定容器启动时执行的命令

指令之间的区别:

5.Dockerfile构建过程:

基础知识:

构建镜像和运行容器:

思路:

6.实战练习

7.注意事项


Dockerfile文件编写

1.什么是Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),用于构建镜像。每一条指令构建一层镜像,因此每一条指令的内容,就是描述该层镜像应当如何构建。dockerfile的原理就是镜像分层

Dockerfile 用于指示 docker image build 命令自动构建Image的源代码是纯文本文件。

2. Dockerfile作用

  • 标准化构建流程:它确保每次构建镜像的过程都是相同的,这有助于复现性和可维护性。
  • 自动化构建:自动化处理从基础镜像到最终镜像的整个构建过程。
  • 可重复性:可以多次使用同一个 Dockerfile 构建镜像,每次都得到相同的结果。
  • 环境配置:可以在 Dockerfile 中配置运行应用所需的所有依赖项和环境变量。

3.dockerfile 的基本结构:

  • 基础映像(Base Image):使用 FROM 指令指定基础映像,作为构建镜像的起点。基础映像通常包含了操作系统和一些预装的软件和工具。
  • 构建过程指令:使用一系列指令来描述构建过程,例如 RUN 用于执行命令和安装软件包,COPY 用于拷贝文件和目录,ADD 用于拷贝和提取文件,WORKDIR 用于设置工作目录,等等。
  • 容器启动指令:使用 CMD 或 ENTRYPOINT 指令来定义容器启动时要执行的命令,也就是默认的容器执行命令。

4.dockerfile指令:

FROM  指定基础镜像,dockerfile构建镜像的第一个指令

        Eg:FROM centos:centos7.9.2009

LABEL  指定镜像维护人信息

        Eg:LABEL ZhangSan zs@163.com

ADD/COPY 复制本地文件/目录到镜像中

        COPY 指令用于将本地文件复制到容器中。可以复制单个文件,也可以复制整个目录。

语法格式:

COPY src dest

COPY ["src", "dest"]

解析:

  • <src源路径>:源文件或者源目录
  • <dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。

        Eg:COPY test.txt /absoluteDir/

ADD 将宿主机目录下(或远程文件)的文件拷贝进镜像,且会自动处理URL和解压tar压缩包。

语法格式:

ADD URL   /dest #将文件下载到容器内部并以dest命名

ADD URL   /dest/ #将文件下载到容器内的/dest目录

ADD src   /dest/ #将本地文件传到容器/dest目录下,压缩文件会自动解压

解析:

  • src 路径必须在构建的上下文中; 不能使用 ../something /something 这种方式,因为docker 构建的第一步是将上下文目录(和子目录)发送到docker守护程序。
  • 如果 src 是URL,并且 dest 不以斜杠结尾,则从URL下载文件并将其复制到 dest 。
  • 如果 dest 以斜杠结尾,将自动推断出url的名字(保留最后一部分),保存到 dest
  • 如果 src 是目录,则将复制目录的整个内容,包括文件系统元数据。

        Eg:ADD alertmanager-0.19.0.linux-amd64.tar.gz /usr/local/bin

RUN 指定Linux命令,建议多个命令用 && 或 ; 串起来使用

语法格式:

RUN <命令行命令>  ( shell 形式, /bin/sh -c 的方式运行,避免破坏shell字符串)

        Eg: RUN /bin/bash -c 'source $HOME/.bashrc; \

               echo $HOME'

ENV 设置镜像环境变量

这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指令中直接使用这些环境变量;相当于定义(赋值)。

        Eg:ENV CATALINA_HOME /usr/local/tomcat

                WORKDIR $CATALINA_HOME

EXPOSE 暴露容器端口

       EXPOSE指令实际上不会发布端口。 它充当构建映像的人员和运行容器的人员之间的一种文档,即有关打算发布哪些端口的信息。

        Eg:EXPOSE 80/tcp

VOLUME 指定容器的匿名数据卷

       Eg: VOLUME /var/log

作用:把容器的某些文件夹映射到主机外部

解析:

  • VOLUME 挂载点
  • 无法指定宿主机的目录,会挂载到宿主机/var/lib/docker/volumes下随机生成的目录下
  • 挂载点可以是一个路径,也可以是数组(数组中的每一项必须用双引号)

USER  指定容器运行用户

       指定该镜像以及构建镜像时的命令以什么样的用户去执行,如果不指定,默认是root。(一般不修改该配置),可搭配COPY使用。

语法格式:

USER <user>[:<group>]

        Eg:USER patrick

                USER 1000:1000

WORKDIR  指定镜像的工作目录

       WORKDIR指令为Dockerfile中跟随它的所有 RUN,CMD,ENTRYPOINT,COPY,ADD 指令设置工作目 录。 如果WORKDIR不存在,即使以后的Dockerfile指令中未使用它也将被创建。

WORKDIR指令可在Dockerfile中多次使用。如果提供了相对路径,则它将相对于上一个WORKDIR指令的路径。

       Eg:WORKDIR /a

WORKDIR b

WORKDIR c

RUN pwd

#结果 /a/b/c

ARG 指定构建镜像时传入的参数

构建时--build-arg 指定参数会覆盖Dockerfile 中指定的同名参数     docker build --build-arg 变量=值

ARG只在构建期有效,运行期无效,且一次只能指定一个参数

       Eg:ARG version=3.13.4

FROM alpine:$version

CMD/ENTRYPOINT  指定容器启动时执行的命令

       语法格式:

CMD command param1 param2 

CMD ["param1","param2"] 

ENTRYPOINT ["executable", "param1", "param2"]

       Eg:CMD ["1111"]

               CMD ["2222"]

               ENTRYPOINT ["echo"]

#构建出如上镜像后测试

docker run xxxx:效果 echo 2222

指令之间的区别:
  • ADD 和 COPY 的区别

COPY只能复制本地文件/目录到镜像中

ADD不光可以复制本地文件/目录到镜像中,还可以通过URL下载文件复制到镜像中,还能将本地tar压缩包解压后复制到镜像中。(URL下载和tar包解压特性不能一起使用)

  • ENTRYPOINT 和 CMD 的区别

CMD 提供容器默认的执行命令,可以被运行容器时传入的命令覆盖。

ENTRYPOINT 配置容器启动时执行的默认可执行文件,可以被运行容器时传入的命令追加到其参数之后。

ENTRYPOINT 指定的容器启动时运行命令优先级更高,如果 ENTRYPOINT 和 CMD 同时存在,CMD 指定内容将作为 ENTRYPOINT 指定的命令的选项或参数去使用

5.Dockerfile构建过程:

基础知识:
  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令按照从上到下,顺序执行
  • # 表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交
构建镜像和运行容器:

保存好 Dockerfile 后,可以使用以下命令构建镜像。在Docker中,docker build -t my-node-app . 中的小数点代表当前上下文的路径。这个路径是构建过程中 Docker 引擎查找 Dockerfile 和其他构建上下文的文件的位置。

docker build 命令会将指定的路径(这里是小数点 .)作为构建上下文。构建上下文是构建过程中用来查找 Dockerfile 和其他构建文件的目录。在这个例子中,. 表示当前目录,即你运行 docker build 命令的目录。

        Eg:docker build -f Dockerfile -t entrytest .

思路:
  • 基于一个空的镜像
  • 下载需要的环境 ADD
  • 执行环境变量的配置 ENV
  • 执行一些Linux命令 RUN
  • 日志 CMD
  • 端口暴露 EXPOSE
  • 挂载数据卷 VOLUMES

6.实战练习

编写Dockerfile文件,构建entrytest镜像,

要求:

基于centos镜像,输出hello world

#编写Dockerfile文件[root@master Monitor]# vi DockerfileFROM centos:centos7.9.2009ENTRYPOINT ["echo","hello"]CMD ["world"]#运行容器,传递参数[root@master Monitor]# docker build -f Dockerfile -t entrytest .Sending build context to Docker daemon  360.5MBStep 1/3 : FROM centos:centos7.9.2009---> eeb6ee3f44bdStep 2/3 : ENTRYPOINT ["echo","hello"]---> Running in 92f02cf3ef33Removing intermediate container 92f02cf3ef33---> dd20bc124389Step 3/3 : CMD ["world"]---> Running in 3826cda9251aRemoving intermediate container 3826cda9251a---> 5acc8a29cae8Successfully built 5acc8a29cae8Successfully tagged entrytest:latest[root@master Monitor]# docker run entrytesthello world[root@master Monitor]# docker run entrytest yunhello yun

7.注意事项

1.如果不指定Dockerfile文件,Dockerfile的命名必须为Dockerfile。大小写不能变。

2.构建镜像的时候要看好你的文件是不是这个目录,要不然打到一半会报错,说找不到文件,切记要记得放文件,在放文件的目录执行。

3.如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。但是ENTRYPOINT不会被docker run后面的命令覆盖, 而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序

4. Dockerfile 中可以有多个 CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换

5. 用 VOLUME 声明了卷,那么以后对于卷内容的修改会被丢弃,即在dockerfile构建的时候无法再修改使用volume挂载出去的目录,所以, 一定在volume声明之前修改内容 ;另外docker commit提交新镜像的的时候也不会继承之前镜像的卷

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ARM学习(38)多进程多线程之间的通信方式

ARM学习(38)ARM学习(38)多进程多线程之间的通信方式 一、问题背景 笔者在调试模拟器的时候,碰到进程间通信的问题,一个进程在等另外一个进程ready的时候,迟迟等不到,然后通过调试发现,另外一个进程变量已经变化了,但是当前进程变量没变化,需要了解进程间通信的方式…

pytest -s执行的路径

pytest -s执行的路径&#xff1a; 直接写pytest -s&#xff0c;表示从当前路径下开始执行全部.py的文件。 执行具体指定文件&#xff1a;pytest -s .\testXdist\test_dandu.py 下面这样执行pytest -s 会报找不到文件或没权限访问&#xff0c; 必须要加上具体文件路径pytest -s…

XXE练习

pikachu-XXE靶场 1.POC:攻击测试 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe "a">]> <foo>&xxe;</foo> 2.EXP:查看文件 <?xml version"1.0"?> <!DOCTYPE foo [ <!ENTITY xxe SY…

Numpy基本介绍

目录 1、Numpy的优势 1.1、ndarray介绍 1.2、ndarray与Python原生list运算效率对比 1.3、ndarray的优势 1.3.1、内存块风格 1.3.2、ndarray支持并行化运算(向量化运算) 1.3.3、效率远高于纯Python代码 2、N维数组-ndarray 2.1、ndarray的属性 2.2、ndarray的形状 2…

用前端html如何实现2024烟花效果

用HTML、CSS和JavaScript编写的网页&#xff0c;主要用于展示“2024新年快乐&#xff01;”的文字形式烟花效果。下面是对代码主要部分的分析&#xff1a; HTML结构 包含三个<canvas>元素&#xff0c;用于绘制动画。引入百度统计的脚本。 CSS样式 设置body的背景为黑…

makefile文件

简介&#xff1a; 自动化编译&#xff1a;只需要一个make命令&#xff0c;整个工程自动编译 提高编译效率&#xff1a;再次编译时&#xff0c;只编译修改的文件&#xff08;查看时间戳&#xff0c;根据修改文件的时间判断文件是否被修改&#xff09; 基本语法&#xff1a; …

ArKTS基础组件

一.AlphabetIndexer 可以与容器组件联动用于按逻辑结构快速定位容器显示区域的组件。 子组件 color:设置文字颜色。 参数名类型必填说明valueResourceColor是 文字颜色。 默认值&#xff1a;0x99182431。 selectedColor:设置选中项文字颜色。 参数名类型必填说明valueRes…

微积分复习笔记 Calculus Volume 2 - 4.3 Separable Equations

4.3 Separable Equations - Calculus Volume 2 | OpenStax

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…

WPF DataTemplate 数据模板

DataTemplate 顾名思义&#xff0c;数据模板&#xff0c;在 wpf 中使用非常频繁。 它一般用在带有 DataTemplate 依赖属性的控件中&#xff0c;如 ContentControl、集合控件 ListBox、ItemsControl 、TabControls 等。 1. 非集合控件中使用 <UserControl.Resources>&l…

LM芯片学习

1、LM7805稳压器 https://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn1852815231102873600&utm_sourcewechat_sessionhttps://zhuanlan.zhihu.com/p/626577102?utm_campaignshareopn&utm_mediumsocial&utm_psn18528…

OCR多模态大模型:视觉模型与LLM的结合之路

原文&#xff1a;https://zhuanlan.zhihu.com/p/7783443583 在使用多模态大模型(Visual Language Model, VLM)做视觉信息抽取时&#xff0c;常常出现错字的问题。为了解决这一问题&#xff0c;本文提出了一种名为Guidance OCR的方法。该方法在不额外训练模型的情况下&#xff…

【C++游记】string的使用和模拟实现

枫の个人主页 你不能改变过去&#xff0c;但你可以改变未来 算法/C/数据结构/C Hello&#xff0c;这里是小枫。C语言与数据结构和算法初阶两个板块都更新完毕&#xff0c;我们继续来学习C的内容呀。C是接近底层有比较经典的语言&#xff0c;因此学习起来注定枯燥无味&#xf…

飞牛 fnos 上用docker部署一款网页端办公系统

描述 一款高效的内网办公操作系统&#xff0c;内含word/excel/ppt/pdf/内网聊天/白板/思维导图等多个办公系统工具&#xff0c;支持原生文件存储。平台界面精仿windows风格&#xff0c;操作简便&#xff0c;同时保持低资源消耗和高性能运行。无需注册即可自动连接内网用户&…

【网络安全】网站常见安全漏洞—服务端漏洞介绍

文章目录 网站常见安全漏洞—服务端漏洞介绍引言1. 第三方组件漏洞什么是第三方组件漏洞&#xff1f;如何防范&#xff1f; 2. SQL 注入什么是SQL注入&#xff1f;如何防范&#xff1f; 3. 命令执行漏洞什么是命令执行漏洞&#xff1f;如何防范&#xff1f; 4. 越权漏洞什么是越…

单元测试-Unittest框架实践

文章目录 1.Unittest简介1.1 自动化测试用例编写步骤1.2 相关概念1.3 用例编写规则1.4 断言方法 2.示例2.1 业务代码2.2 编写测试用例2.3 生成报告2.3.1 方法12.3.2 方法2 1.Unittest简介 Unittest是Python自带的单元测试框架&#xff0c;适用于&#xff1a;单元测试、Web自动…

C++动态规划解决最长公共子序列

动规非常经典的一道题目&#xff0c;由于需要用到二维数组——姑且算为中等难度的题目&#xff0c;其实和01背包有着极高的相似度&#xff0c;无论是实现还是理论。 今天这篇博客不讲过多的DP理论&#xff0c;重在讲解题目本身。其实有一定经验的同志都清楚&#xff0c;DP的难点…

学习日志024--opencv中处理轮廓的函数

目录 前言​​​​​​​ 一、 梯度处理的sobel算子函数 功能 参数 返回值 代码演示 二、梯度处理拉普拉斯算子 功能 参数 返回值 代码演示 三、Canny算子 功能 参数 返回值 代码演示 四、findContours函数与drawContours函数 功能 参数 返回值 代码演示 …

《Modern CMake for C++》学习笔记

学习 Modern CMake for C - Second Edition 时的学习笔记&#xff0c;供大家参考。 相关资源&#xff1a; 原书链接&#xff1a; Modern CMake for C: Effortlessly build cutting-edge C code and deliver high-quality solutions , Second Edition 中文翻译链接&#xff1a…

实战 | 某院校小程序记录

更多大厂面试经验的视频分享看主页和专栏 目录&#xff1a; 前言&#xff1a; 渗透思路 1.绕过前端 2.信息泄露 3.爆破用户账号密码 4.信息泄露2 结束 前言&#xff1a; 遇到一个学校小程序的站点&#xff0c;只在前端登录口做了校验&#xff0c;后端没有任何校验&#x…