Dockerfile文件编写

server/2024/12/19 13:45:18/

目录

Dockerfile文件编写

1.什么是Dockerfile

2. Dockerfile作用

dockerfile%20%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84%EF%BC%9A-toc" style="margin-left:40px;">3.dockerfile 的基本结构:

dockerfile%E6%8C%87%E4%BB%A4%EF%BC%9A-toc" style="margin-left:40px;">4.dockerfile指令:

dockerfile%E6%9E%84%E5%BB%BA%E9%95%9C%E5%83%8F%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%8C%87%E4%BB%A4-toc" style="margin-left:120px;">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 中配置运行应用所需的所有依赖项和环境变量。

dockerfile%20%E7%9A%84%E5%9F%BA%E6%9C%AC%E7%BB%93%E6%9E%84%EF%BC%9A" style="margin-left:0;text-align:justify;">3.dockerfile 的基本结构:

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

dockerfile%E6%8C%87%E4%BB%A4%EF%BC%9A" style="margin-left:0;text-align:justify;">4.dockerfile指令:

dockerfile%E6%9E%84%E5%BB%BA%E9%95%9C%E5%83%8F%E7%9A%84%E7%AC%AC%E4%B8%80%E4%B8%AA%E6%8C%87%E4%BB%A4" style="margin-left:0;text-align:justify;">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.ppmy.cn/server/151450.html

相关文章

React 组件间的通信

React 父传子 实现&#xff1a; function Son(props){return <div>{ props.name }</div> } ​ ​ function App(){const name this is app namereturn (<div><Son name{name}/></div>) } 注意&#xff1a;这里可以传递任何类型&#xff0c;…

C语言 排序

时间:2024.12.18 一、冒泡排序(Bubble Sort) 原理 比较相邻的元素。如果第一个比第二个大,就交换它们两个。对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。针对所有的元素重复以上的步骤,除了最后一个。持续每次对越…

电脑文档损坏:原因剖析和修复方法

在使用电脑的过程中&#xff0c;许多用户可能会遇到文档突然提示损坏、无法打开的情况。这种情况的发生往往让人感到困惑&#xff0c;特别是当并未进行任何明显错误操作时。以下是一些常见的原因以及应对方法。 一、文档损坏的常见原因 1、非人为的异常操作&#xff1a; 在编…

【CC2530开发基础篇】继电器模块使用

一、前言 1.1 开发背景 本实验通过使用CC2530单片机控制继电器的吸合与断开&#xff0c;深入了解单片机GPIO的配置与应用。继电器作为一种常见的电气控制元件&#xff0c;广泛用于自动化系统中&#xff0c;用于控制大功率负载的开关操作。在本实验中&#xff0c;将通过GPIO口…

Objective-C实现字符串是否是有效的url地址算法(附完整源码)

Objective-C实现字符串是否是有效的url地址算法 要验证一个字符串是否是有效的 URL 地址,可以使用多种方法,包括正则表达式匹配、使用 NSURL 类进行解析等。下面,我将提供一个完整的 Objective-C 实现,包含以下内容: URLValidator 类:包含一个方法 isValidURL: 用于验证字…

计算无人机俯拍图像的地面采样距离(GSD)矩阵

引言 在无人机遥感、测绘和精细农业等领域&#xff0c;地面采样距离&#xff08;Ground Sampling Distance&#xff0c;简称 GSD&#xff09;是一个非常重要的指标。GSD 是指图像中每个像素在地面上实际代表的物理距离&#xff0c;通常以米或厘米为单位。GSD 决定了图像的空间…

多速率信号处理

介绍 简单来说&#xff0c; 多速率信号处理&#xff0c;是指对同时存在两个以上数据速率的系统进行信号处理。多速率信号处理原理就是通过改变信号速率&#xff0c;以适应系统内部各个节点对信号速率的要求。这里的速率其实就是指采样率。 多速率技术已广泛应用于数字音频处理…

NVM:安装配置使用(详细教程)

文章目录 一、简介二、安装 nvm三、配置 nvm 镜像四、配置环境变量五、使用教程5.1 常用命令5.2 具体案例 六、结语 一、简介 在实际的开发和学习中可能会遇到不同项目的 node 版本不同&#xff0c;而出现的兼容性问题。 而 nvm 就可以很好的解决这个问题&#xff0c;它可以在…