• LABLE 给镜像添加元数据信息
  • COPY 用户从宿主机的当前目录复制文件至创建的新映像文件
COPY <src> <dest>
COPY ["<src>",..."<dest>"]
<src>为要复制的源文件或目录,支持使用通配符
<dest>为目标路径,建议使用绝对路径
复制代码
  1. 必须是build上下文中的路径,不能是其父目录中的文件
  2. 如果是目录,则其内部文件或子目录会被递归复制, 但是目录本身不会被复制

  • ADD 类似于COPY指令,ADD支持使用tar文件和URL路径
操作如COPY
复制代码

如果是一个本地系统上压缩格式的tar文件,它降被展开为一个目录,其行为类似 "tar -x"命令,通过url获取到的tar文件将不会自动展开;


  • WORKDIR 用于为Dockerfile中所有的RUN、CMD、ENTRYPOINT、COPY和ADD指定工作目录
WORKDIR /usr/local/
ADD nginx-1.15.2.tar.gz ./src/复制代码

  • VOLUME

定义存储卷,只能制定容器内部的目录


  • EXPOSE 用户为容器打开制定要监听的端口以实现与外部通信
EXPOSE <port>
EXPOSE 11211/udp 11211/tcp
复制代码

只有docker run 加 -P选项时才会将端口暴漏出来,如果不加,将不暴漏端口

[root@cv0002 docker]# docker run --name t1 --rm tinyhttpd:v0.0.6 /bin/httpd -f -h /data/web/html
[root@cv0002 ~]# docker port t1
[root@cv0002 ~]#[root@cv0002 docker]# docker run --name t1 --rm -P tinyhttpd:v0.0.6 /bin/httpd -f -h /data/web/html
[root@cv0002 ~]# docker port t1
80/tcp -> 0.0.0.0:1024
复制代码

  • ENV 用于为镜像定义所需的环境变量,并可被Dockerfile文件中位于其后的其他指令(如ENV,ADD,COPY等)所调用,调用格式为\$variable或${variable}
ENV <key> <value>或
ENV <key>=<value> ...
复制代码
  1. 第二种格式可以设置多个变量,若中包含空格,可以使用反斜线转义,也可通过对加引号来标识,反斜线也可以用于续行
  2. 定义多个变量时,建议使用第二种方式,以便在同一层中完成所有功能。
  3. 如果在命令行中定义-e 更改环境变量,也只是更改了环境变量,之前编译时候做的改变是更改不了的。
[root@cv0002 docker]# docker run --name t1 --rm tinyhttpd:v0.0.7 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=a2c3f68db164
DOC_ROOT=/data/web/html/
WEB_SERVER_PACKAGE=nginx-1.15.2
HOME=/root
[root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 printenv
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=27213da32d60
WEB_SERVER_PACKAGE=nginx-1.15.1
DOC_ROOT=/data/web/html/
HOME=/root
[root@cv0002 docker]# docker run --name t1 --rm -e WEB_SERVER_PACKAGE="nginx-1.15.1" tinyhttpd:v0.0.7 ls /usr/local/src
nginx-1.15.2复制代码

RUN和CMD 如图所示

  1. RUN 在docker build中运行,构建镜像时为了使镜像完整使用的命令。在初始化容器时候时不可能再运行。
  2. CMD 定义一个镜像文件启动为容器时候默认要运行的程序,且其运行结束后,容器也将终止,而docker容器默认只运行一个程序。CMD指令可以被docker run 的命令行所覆盖

注意:RUN命令在Dockerfile中可以有多个,且可以都生效,但是CMD有多个的话,但只有最后一个生效

  • RUN 命令格式
RUN <command>
RUN ["<executable>","<param1>","<param2>"]
复制代码
  1. 第一种格式,通常是一个shell命令,且以"/bin/sh -c "来运行它,这意味着此进程在容器中的PID不为1,不能接收unix信号(因为接收信号的都是进程为1的来接收),因此,当使用docker stop 命令停止容器时,此京城接收不到sigterm信号;
  2. 第二种语法格式中的参数是一个json格式的数组,其中为要运行的命令,后面为参数。然而,此格式的命令不会以"/bin/sh -c" 来发起,因此不支持通配符等shell特性

注意:Json数组中,要使用双引号

  • CMD命令格式
CMD <command>
CMD ["<executable>","<param1>","<para
复制代码
  1. 前两种语法格式的意义同RUN
  2. 第三种则用于为ENTRYPOINT指令提供默认参数

  • ENTRYPOINT
  1. 类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序
  2. 与CMD不同的是,有ENTRYPOINT启动的程序不会被docker run命令行制定的参数所覆盖,而且,这些命令行参数会被当做参数传递给ENTRYPOINT制定的程序,但会被docker run命令的--entryporint选项的参数可覆盖ENTRYPOINT指令制定的程序
ENTRYPOINT <command>
ENTRYPOINT [<"<executable>","<param1>","<param2>">]
复制代码

注意:docker run传入的命令参数会覆盖CMD指令的内容并且附加到ENTRYPOINT命令最后作为其参数使用

注意:Dockerfile文件中也可以存在多个ENTRYPOINT指令,但仅有最后一个会生效


  • USER

    用于指定运行的image时的或运行Dockerfile中的任何RUN、CMD、或ENTRYPOINT指令指定的程序时的用户名或UID,默认为root用户

USER <UID>|<username>
复制代码

注意:可以为任意数字,但是事件中必须为/etc/passwd中某用户的有效UID,否则docker run命令将运行失败


  • HEALTHCHECK 检测应用是否正常运行
HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/
#3s后开始检查,需要等容器里面的操作全部运行完成再检查
复制代码

  • SHELL 修改或额外定义运行程序的默认shell
复制代码

  • STOPSIGNAL 更好docker stop 传过来的信号指令,默认为15
STOPSIGNAL signal
复制代码

  • ARG 只再build中使用,类似变量,可以在docker run的时候通过--build-tag传值,而ENV不可在docker run时传值。

  • ONBUILD 用于在Dockerfile中定义一个触发器(延时执行)
ONBUILD <指令>
复制代码

当此Dockerfile被build为映像文件后,此映像文件亦可作为base image被另一个Dockerfile用作FROM指令的参数,并以之构建新的映像文件,此时,ONBUILD后的指令才会执行。

注意:在ONBUILD指令中使用ADD或COPY指令应该格外小心,因为新构建过程的上下文有可能会缺少源文件


喜欢我写的东西的朋友可以关注一下我的公众号:Devops部落

转载于:https://juejin.im/post/5c8b0b04f265da2dc70742f6

十分钟熟练Dockerfile指令相关推荐

  1. android手机怎么拆机,韩雪拆安卓手机:十分钟熟练拆机/详解每个部件

    原标题:韩雪拆安卓手机:十分钟熟练拆机/详解每个部件 韩雪再拆安卓手机,近日,曾给iPhone换屏幕的科技达人韩雪,再次成功拆解安卓手机,并与知名游戏主播一同竞技.直播时,韩雪娴熟地拆下手机的所有部件 ...

  2. 十分钟教你开发EOS智能合约

    十分钟教你开发EOS智能合约 在CSDN.柏链道捷(PDJ Education).HelloEOS.中关村区块链产业联盟主办的「EOS入门及最新技术解读」专场沙龙上,柏链道捷(PDJ Educatio ...

  3. Dockerfile 指令详解1

    Dockerfile 指令详解 我们已经介绍了 FROM,RUN,还提及了 COPY, ADD,其实 Dockerfile 功能很强大,它提供了十多个指令.下面我们继续讲解其他的指令. COPY 复制 ...

  4. python十分钟教程_简洁的十分钟Python入门教程

    [简介] Python是一种动态解释型的编程语言.Python可以在Windows.UNIX.MAC等多种操作系统上使用,也可以在Java..NET开发平台上使用. [特点] 1 Python使用C语 ...

  5. gdb好文章:GDB十分钟教程

    (GUI调试器:insight和ddd) list(l) :其作用就是列出程序的源代码,默认每次显示10行. list 行号:将显示当前文件以"行号"为中心的前后10行代码,如:l ...

  6. 空中交警:借你一双“慧眼”,让你看透这飞机的“黑色十分钟”

    本文分享自华为云社区<[华为云 EI]飞机的"黑色十分钟"能被人工智能消灭吗?>,原文作者:HWCloudAI . 近年来,"AI的应用和落地"逐渐 ...

  7. 十分钟,我搞定了一个人物检测模型

    原作:Supervise.ly 铜灵 编译自 Hackernoon 量子位 出品 | 公众号 QbitAI 人物检测确实是个老生常谈的话题了,自动驾驶中的道路行人检测.无人零售中的行为检测.时尚界的虚 ...

  8. 这是我见过最好的Python教程:十分钟带你认识Python

    这篇文章主要介绍了简洁的十分钟Python入门教程,Python语言本身的简洁也使得网络上各种Python快门入门教程有着很高的人气,本文是国内此类其中的一篇,需要的朋友可以参考下 [简介] Pyth ...

  9. 十分钟教会女朋友上手阿里云服务器

    十分钟教会女朋友上手阿里云服务器 云服务的概念越来越火,阿里云的品牌也经常出现在圈内圈外人的视野里.作为程序员的我们更是不得不接触的一个概念.最近很多人因为很多原因购买了阿里云服务器却不知道怎么使用, ...

最新文章

  1. 听说这是互联网公司招工时忽悠的黑话? | 每日趣闻
  2. 推荐几个MySQL大牛的博客
  3. fin.is_open()与fin.open()有什么区别?
  4. C++ NULL指针学习 - Win32版本
  5. LeetCode 79 Word Search(单词查找)
  6. 根据分类id找出父类id
  7. java枚举 取值_java枚举值的使用
  8. rz/sz命令参数解释
  9. Docker入门者手册
  10. 注册表的基本操作(.Net)
  11. steam账号被盗找回概率_如何找回忘记的Steam密码
  12. Java服务MQ消息队列容灾方案
  13. 错误码errno和perror函数
  14. 在线分析仪器(一)概述
  15. 51单片机程序存储器和数据存…
  16. PS精修电影胶片调色特效[附素材及方法]
  17. 代写硕士论文 计算机 代码,天大、厦大两硕士代写买卖论文被撤销学位
  18. 大一计算机思维知识点,大学计算机基础教学中计算思维的培养途径
  19. 蓝桥杯单片机之PCF8591模块的使用
  20. 中文真伟大!竟然有只能看,不能读的文章

热门文章

  1. boost::integer_traits用法的测试程序
  2. boost::container实现显式实例静态向量测试程序
  3. Boost:构造一个流对象,任何发送到此流将标准输出
  4. ITK:向转换工厂注册非默认转换
  5. ITK:计算灰度图像的梯度幅度
  6. DCMTK:创建和验证DICOM数字签名
  7. VTK:可视化之ScaleGlyphs
  8. 为Qt Designer创建自定义Widgets小部件
  9. 通过QML定义对象类型
  10. C语言求二叉树的垂直总和(附完整源码)