【docker 】Dockerfile指令学习

学习文档地址

上篇文章:【docker 】基于Dockerfile创建镜像

Dockerfile指令文档地址

.dockerignore 文件

Dockerfile指令

常见的指令

Dockerfile 指令说明
FROM指定基础镜像,用于后续的指令构建。
MAINTAINER指定Dockerfile的作者/维护者。(已弃用,推荐使用LABEL指令)
LABEL添加镜像的元数据,使用键值对的形式。
RUN在构建过程中在镜像中执行命令。
CMD指定容器创建时的默认命令。(可以被覆盖)
ENTRYPOINT设置容器创建时的主要命令。(不可被覆盖)
EXPOSE声明容器运行时监听的特定网络端口。
ENV在容器内部设置环境变量。
ADD将文件、目录或远程URL复制到镜像中。
COPY将文件或目录复制到镜像中。
VOLUME为容器创建挂载点或声明卷。
WORKDIR设置后续指令的工作目录。
USER指定后续指令的用户上下文。
ARG定义在构建过程中传递给构建器的变量,可使用 "docker build" 命令设置。
ONBUILD当该镜像被用作另一个构建过程的基础时,添加触发器。
STOPSIGNAL设置发送给容器以退出的系统调用信号。
HEALTHCHECK定义周期性检查容器健康状态的命令。
SHELL覆盖Docker中默认的shell,用于RUNCMDENTRYPOINT指令。

注释

指令不区分大小写。然而,惯例是他们要大写,以便更容易地将他们与论点区分开来。

Docker按顺序运行Dockerfile中的指令。Dockerfile必须以FROM指令开头。这可能在解析器指令、注释和全局范围的ARG之后。FROM指令指定要从中构建的父映像。FROM前面只能有一个或多个ARG指令,这些指令声明Dockerfile中FROM行中使用的参数。

Docker 将以开头的行视为#注释,除非该行是有效的 解析器指令。行中其他任何位置的标记#都被视为参数。

为了向后兼容,注释 ( #) 和指令(例如RUN)之前的前导空格将被忽略,但不鼓励这样做。在这些情况下,不会保留前导空格,因此以下示例是等效的:

示例1:
        # 第一个DockerfileFROM nginxRUN echo "<h1>程序员食堂 的第一个Dockerfile </h1>" >> /usr/share/nginx/html/index.html

指令参数中的空格(例如下面的命令RUN)将被保留

示例2:
# 第一个Dockerfile
FROM nginxRUN echo "<h1>程序员食堂 的第一个Dockerfile </h1>" >> /usr/share/nginx/html/index.html

ENV  环境变量

环境变量官网地址

环境变量(用ENV声明)也可以在某些指令中用作由 Dockerfile. 还可以处理转义以将类似变量的语法按字面意思包含到语句中。

ENV指令将环境变量设置<key>为值 <value>。该值将存在于构建阶段中所有后续指令的环境中,并且 也可以在许多指令中内联替换。该值将被解释为其他环境变量,因此如果不转义引号字符将被删除。与命令行解析一样,引号和反斜杠可用于在值中包含空格。

示例1:
ENV MY_NAME="zhang san  feng"
ENV MY_HOME=wu\ dang\  shan
ENV MY_WORK=KungFuTeacher

ENV指令允许<key>=<value> ...一次设置多个变量,下面的示例将在最终图像中产生相同的最终结果:

示例2:
ENV MY_NAME="zhang san  feng"  MY_HOME=wu\ dang\  shan  MY_WORK="kung fu teacher"

FROM指令

定制的镜像都是基于 FROM 的镜像,这里的 nginx 就是定制需要的基础镜像。并且必须是第一条指令。

如果不以任何镜像为基础,那么写法为:FROM scratch。

语法
FROM [image]FROM [image]:[tag]FROM [image]:[digest]

<tag><digest> 是可选项,如果没有选择,那么默认值为latest

RUN指令

功能为运行指定的命令
RUN命令有两种格式,shell 格式exec 格式

shell 格式:
# [命令行命令] 等同于,在终端操作的 shell 命令。
#  RUN [命令行命令]RUN echo "<h1>程序员食堂 的第一个Dockerfile </h1>" >> /usr/share/nginx/html/index.html
exec 格式:
RUN ["可执行文件", "参数1", "参数2"]# nginx-run.sh 是一个执行nginx的脚本RUN ["./nginx-run.sh", "start"] 等价于 RUN ./nginx-run.sh start

MAINTAINER指令(不推荐)

MAINTAINER指令是维护者信息。

# MAINTAINER <name>MAINTAINER chengxuyuanshitang

COPY指令

COPY指令,从上下文目录中复制文件或者目录到容器里指定路径,可以是通配符表达式,其通配符规则要满足 Go 的 filepath.Match 规则。不会自动解压文件,也不能访问网络资源。

# 语法:
OPY [--chown=<user>:<group>] <源路径1>...  <目标路径>
COPY [--chown=<user>:<group>] ["<源路径1>",...  "<目标路径>"]#示例:#添加 "test" 到 `WORKDIR` /test/  
COPY test* /test/# 添加 "test" 到 /test/   
COPY test?.txt /test/

[--chown=<user>:<group>]:可选参数,用户改变复制到容器内文件的拥有者和属组。

ADD指令

官方推荐使用 COPY。

ADD指令将本地文件添加到容器中。

执行 【源文件】 为 tar 压缩文件的话,压缩格式为 gzip, bzip2 以及 xz 的情况下,会自动复制并解压到 【目标路径】。

在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

可以访问网络资源,类似wget。

# 格式:
ADD <源文件>... <目标路径>
ADD ["<源文件>",... "<目标路径>"] 用于支持包含空格的路径#示例:# 添加所有以"test"开头的文件到/test/目录下
ADD test* /test/          # ? 替代一个单字符,添加所有以"test"开头结尾是一个字符的文件到/test/目录下,例如:"test1.txt"
ADD test?.txt /test/# 添加 "test" 到 `WORKDIR` /test/   
ADD test test/# 添加 "test" 到 /test/     
ADD test /test/    

CMD指令

构建容器后调用,也就是在容器启动时才进行调用。类似于 RUN 指令,用于运行程序。

CMD 在docker run 时运行。

为启动的容器指定默认要运行的程序,程序运行结束,容器也就结束。CMD 指令指定的程序可被 docker run 命令行参数中指定要运行的程序所覆盖。

如果 Dockerfile 中如果存在多个 CMD 指令,仅最后一个生效

# 格式:
CMD <shell 命令> 
CMD ["<可执行文件或命令>","<param1>","<param2>",...] 
CMD ["<param1>","<param2>",...]  # 示例:
CMD echo "This is chengxuyuan test." 
CMD ["/usr/bin/ls","--help"]

ENTRYPOINT指令

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

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

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

# 格式:
ENTRYPOINT ["<executeable>","<param1>","<param2>",...]

构建上下文

docker build命令从Dockerfile和上下文docker buildx build构建 Docker 映像 。

构建上下文是您的构建可以访问的文件集。传递给构建命令的位置参数指定要用于构建的上下文。

命令:

docker build [OPTIONS] PATH | URL | -

可以传递以下任何输入作为构建的上下文:

  • 本地目录的相对或绝对路径
  • Git 存储库、tarball 或纯文本文件的远程 URL
  • docker build通过标准输入通过管道传输到命令的纯文本文件或 tarball

有关可在构建中使用的不同类型的文件系统上下文的更多信息,请参阅:

  • 本地文件
  • Git 存储库
  • 远程 tarball




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

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

相关文章

Intewell-Hyper I_V2.0.0_release版本正式发布

新型工业操作系统_Intewell-Hyper I_V2.0.0_release版本正式发布 软件发布版本信息 版本号&#xff1a;V2.0.0 版本发布类型&#xff1a;release正式版本 版本特点 1.建立Intewell-Hyper I基线版本 版本或修改说明 基于Intewell-Lin V2.3.0_release版本&#xff1a; 1.Devel…

c# 字段和属性(get、set、init)

目录 基本概念&#xff1a; 个人理解&#xff1a; 访问器的默认写法&#xff1a; set与init无法共存&#xff1a; init&#xff1a; 必须在类的实例化时给字段赋值的情况(require属性): 基本概念&#xff1a; “字段”就是类内成员变量&#xff0c;一般为了隐藏数据&…

“一键调整尺寸,轻松完成视频批量剪辑:批量放大视频尺寸“

你是否曾经遇到过需要批量调整视频尺寸的情况&#xff1f;无论是为了适应不同的播放平台&#xff0c;还是为了满足客户的特定需求&#xff0c;批量调整视频尺寸都是一项繁琐而耗时的工作。但是&#xff0c;现在有一种方法可以让你轻松完成这项任务&#xff0c;那就是使用我们的…

ABAP与HANA集成:HANA视图转换为ABAP字典视图

使用场景 最近项目在用HANA开发逻辑&#xff0c;形成了很多过程的计算视图&#xff0c;一般我们BW人员可能直接用计算视图出具前端报表&#xff0c;或者链接到cp使用&#xff0c;没有考虑转换成abap字典视图&#xff0c;也就是前台SE11能查到的视图&#xff0c;但是非开发人员…

PPT插件-好用的插件-放映笔、绘图板-大珩助手

放映笔 幻灯片放映时&#xff0c;工具在幻灯片的左下方&#xff0c;本工具在幻灯片的右侧&#xff0c;可以移动&#xff0c;可以方便在右侧讲课时候使用 绘图板 可在绘图板上写签名、绘制图画、写字等等&#xff0c;点画笔切换橡皮擦&#xff0c;点插入绘图&#xff0c;将背景…

RK3568平台(网络篇) 有线网络基本概念及测试手法

一.什么是交换机&#xff1f; 交换机是一种用于电(光)信号转发的网络设备。它可以为接入交换机的任意两个网络节点提供独享的电信号通路。最常见的交换机是以太网交换机。交换机工作于OSI参考模型的第二层&#xff0c;即数据链路层。交换机拥有一条高带宽的背部总线和内部交换…

Leetcode—78.子集【中等】

2023每日刷题&#xff08;五十九&#xff09; Leetcode—78.子集 算法思想 实现代码 class Solution { public:vector<vector<int>> subsets(vector<int>& nums) {int len nums.size();vector<int> path;vector<vector<int>> ans;f…

24年五年制专转本招生院校有可能发生变动

据悉&#xff0c;24年五年制专转本院校可能将发生改变&#xff0c;南京传媒学院有可能停止招生 将新增一所招生大学&#xff1a;南京航空航天大学金城学院 南京航空航天大学金城学院始建于1999年&#xff0c;是南京航空航天大学联合社会力量创办的独立学院。学校位于江苏省南京…

HPM6750系列--第八篇 Segger Embedded Studio for RISC-V查看外设寄存器

一、目的 在博客《HPM6750系列--第五篇 使用Segger Embedded Studio for RISC-V开发环境》中我们详细介绍了在SES中进行开发调试的相关步骤&#xff0c;但是在调试过程中发现未找到外设寄存器窗口&#xff0c;本篇就此问题指导大家进行设置查看寄存器信息。 二、介绍 请务必先阅…

使用python做一个实用的工具,便捷的定位和操作文档

环境准备&#xff1a;totalcommander 我用的totalcommander&#xff0c;python脚本的快捷键也是在totalcommander中注册的&#xff0c;所以需要先在TC界面下&#xff0c;才能通过预定义的快捷键唤起 python 脚本。以下是我的 totalCommander界面&#xff0c;我定义的快捷键是 …

freeRtos互斥量的使用

所以二进制并不能保证是谁上锁谁解锁&#xff0c;引入互斥量本质并没有解决这个问题&#xff0c;还是要程序员去解决。引入互斥量可以去解决优先级翻转的问题。 一.优先级反转和优先级继承 二. 递归上锁 获得了锁之后&#xff0c;再次执行任务获得锁。 三.创建互斥量 与前面…