当前位置: 首页 > news >正文

【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




相关文章:

  • 爬虫工作量由小到大的思维转变---<第三章 搞多大的盘>
  • c++程序设计定义一个 (图书)类,在该类定义中包括
  • 【数据结构】树状数组总结
  • 推荐一款好用的包含表格识别的OCR网站
  • Debian系统安装OpenVPN
  • javaWebssh汽车销售管理系统myeclipse开发mysql数据库MVC模式java编程计算机网页设计
  • Flink系列之:窗口关联
  • HTML面试题
  • 【Spark面试】Spark面试题答案
  • 修改npm源码解决服务端渲染环境中localstorage报错read properties of undefined (reading getItem)
  • Oracle-应用会话集中在RAC集群一个节点问题
  • 使用 ?? 重新定义逻辑以获得更严格、更安全的 JavaScript 默认值
  • Vue中的数据变化监控与响应——深入理解Watchers
  • 数据分析为何要学统计学(10)——如何进行比率检验
  • 【jmeter】接口测试流程
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • 2017-09-12 前端日报
  • ES6 学习笔记(一)let,const和解构赋值
  • hadoop集群管理系统搭建规划说明
  • HTTP中的ETag在移动客户端的应用
  • Linux链接文件
  • React 快速上手 - 06 容器组件、展示组件、操作组件
  • Spring核心 Bean的高级装配
  • Spring声明式事务管理之一:五大属性分析
  • 给github项目添加CI badge
  • 计算机常识 - 收藏集 - 掘金
  • 前端面试之闭包
  • 网络应用优化——时延与带宽
  • 用element的upload组件实现多图片上传和压缩
  • 最简单的无缝轮播
  • ###项目技术发展史
  • #QT(一种朴素的计算器实现方法)
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • $NOIp2018$劝退记
  • (2)nginx 安装、启停
  • (2021|NIPS,扩散,无条件分数估计,条件分数估计)无分类器引导扩散
  • (js)循环条件满足时终止循环
  • (动态规划)5. 最长回文子串 java解决
  • (二)斐波那契Fabonacci函数
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436
  • (附源码)springboot炼糖厂地磅全自动控制系统 毕业设计 341357
  • (附源码)计算机毕业设计ssm本地美食推荐平台
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (四)Controller接口控制器详解(三)
  • (一)Neo4j下载安装以及初次使用
  • .net core使用EPPlus设置Excel的页眉和页脚
  • .Net Core与存储过程(一)
  • .NET 中让 Task 支持带超时的异步等待
  • .net 桌面开发 运行一阵子就自动关闭_聊城旋转门家用价格大约是多少,全自动旋转门,期待合作...
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • 。。。。。
  • @Repository 注解
  • @requestBody写与不写的情况
  • @Service注解让spring找到你的Service bean
  • [Android] Android ActivityManager