『中级篇』Dockerfile详解(17)

一般的,Dockerfile 分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令。

####官网学习

https://docs.docker.com/engine/reference/builder/#usage

『中级篇』Dockerfile详解(17)

####FROM

必须为第一个命令,指定基础镜像

FROM <image>
FROM <image>:<tag>
FROM <image>@<digest>
FROM scratch #制作base Image
FROM centos #使用base Image
FROM centos:7.9
FROM mysql:5.6

尽量使用官方的image作为base image!那是经得起考验的!

####LABEL

给镜像添加信息。使用docker inspect可查看镜像的相关信息

LABEL maintainer="394498036@qq.com"
LABEL version="1.0"
LABEL description="This is description \
欢迎关注:编程坑太多,我在等你."

其实就类似咱们写代码的注释,很多人写代码不愿意写注释,其实写注释对自己的负责,过段时间翻坑的时候,想想当初的意思,容易很快的解决,所以一定要写LABEL

####RUN

构建镜像时执行的命令

RUN yum update && yum install -y vim \
python-dev #反斜线换行
RUN  apt-get update && apt-get install -y perl \pwgen --no-install-recommends && rm -rf \/var/lib/apt/lists/*   #注意清理cache
RUN  /bin/bash -c 'source $HOME/.bashrc;echo $HOME'

为了美观,复杂的RUN请用反斜线换行,避免无用分层,合并多条命令成一行!

####WORKDIR

工作目录

WORKDIR /test #如果没有会自动创建test目录
WORKDIR jianshu
RUN pwd          #输出结果应该是/test/jianshu

用WORKDIR,不要用RUN cd 尽量使用绝对目录!

####ADD and COPY

  1. 将本地文件添加到容器中,identity, gzip, bzip2,xz,tar.gz,tgz等类型的文件将被添加tar -x命令,进行解压
  2. 同ADD,只是不会解压文件。
    ADD &lt;src&gt;... &lt;dest&gt;
    ADD ["&lt;src&gt;",... "&lt;dest&gt;"] 用于支持包含空格的路径
    COPY &lt;src&gt;... &lt;dest&gt;
    COPY ["&lt;src&gt;",... "&lt;dest&gt;"] 用于支持包含空格的路径
    ADD hello /
    ADD test.tar.gz / #添加到根目录并解压
    WORKDIR /root
    ADD hello test/ # /root/test/hello
WORKDIR /root
COPY hello test/ # /root/test/hello

大部分情况,COPY优于ADD,ADD除了COPY还有额外功能(解压缩)!添加远程文件/目录请使用curl 或者wget

####ENV

设置环境变量

ENV <key> <value>
ENV <key>=<value> ...
ENV MYSQL_VERSION 5.6
E-NV apt-get install -y mysql-server = "${MYSQL_VERSION}" \
&& rm -rf /var/lib/apt/lists/* #引用常亮

尽量多使用,减少维护成本!

学习下面的先了解下

Shell 和Exec 格式

  • Shell格式
    RUN apt-get install -y vim
    CMD echo "hello docker  微信公众号:编程坑太多"
    ENTRYPOINT echo "hello docker 微信公众号:编程坑太多"
  • Exec格式
    RUN ["apt-get", "install", " -y", "vim"]
    CMD ["/bin/echo","hello docker  微信公众号:编程坑太多"]
    ENTRYPOINT ["/bin/echo","hello docker 微信公众号:编程坑太多"]

  • Dockerfile1
    FROM centos
    ENV name Docker
    ENTRYPOINT  echo "hello  $name"
  • Dockerfile2
    FROM centos
    ENV name Docker
    ENTRYPOINT ["/bin/echo", "hello  $name"]

    通过实际的例子查看区别。

    mkdir cmd-entrrypoint
    cd cmd-entrrypoint/
    vi Dockerfile
  • 先执行Dockerfile1
    『中级篇』Dockerfile详解(17)
more Dockerfile

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-entrypoint-shell .

『中级篇』Dockerfile详解(17)

docker run liming/centos-entrypoint-shell 

『中级篇』Dockerfile详解(17)

  • 先执行Dockerfile2
    『中级篇』Dockerfile详解(17)
more Dockerfile

『中级篇』Dockerfile详解(17)

docker build -t  liming/centos-entrypoint-exec .

『中级篇』Dockerfile详解(17)

docker run  liming/centos-entrypoint-exec

『中级篇』Dockerfile详解(17)

我们通过shell格式运行的话,它会通过默认的bash里面通过shell执行命令,它会通过shell替换这边变量,通过exec格式运行的话,只是单纯的执行echo,没办法帮我们替换到$name。如何解决不一样的问题呢?请开始我的表演!修改Dockerfile2

FROM centos
ENV name Docker
ENTRYPOINT ["/bin/bash","-c", "echo hello  $name"]

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-entrypoint-exec-new .

『中级篇』Dockerfile详解(17)

docker run liming/centos-entrypoint-exec-new

『中级篇』Dockerfile详解(17)

『中级篇』Dockerfile详解(17)

是不是很nice!

####CMD

设置容器启动后默认执行的命令和参数

  • 容器启动时默认执行的命令
  • 如果docker run 指定了其他命令,CMD命令被忽略
  • 如何定义了多个CMD,只有最后一个会执行

『中级篇』Dockerfile详解(17)

FROM centos
ENV name Docker
CMD echo "hello $name"

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-cmd-shell .
docker run liming/centos-cmd-shell
docker run -it liming/centos-cmd-shell /bin/bash

『中级篇』Dockerfile详解(17)

####ENTRTYPOINT

设置容器启动时运行的命令

  • 让容器以应用程序或者服务的形式运行
  • 不会被忽略,一定会执行

『中级篇』Dockerfile详解(17)

FROM centos
ENV name Docker
ENTRYPOINT echo "hello $name"

『中级篇』Dockerfile详解(17)

docker build -t liming/centos-entrypoint-shell .
docker run liming/centos-entrypoint-shell
docker run -it liming/centos-entrypoint-shell /bin/bash

『中级篇』Dockerfile详解(17)

个人网站:IT人故事会 idig8.com

PS:Dockerfile详解基本就介绍这么多,可能还有很多命令没有讲解,以后用到了在说吧。一定要CMD和ENTRTYPOINT因为很多官方的都常用这两个命令。


往期精彩
  1. docker导学(一)
  2. 容器的技术概述(二)
  3. docker的魅力初体验-5分钟安装wordpress不走弯路(三)
  4. docker官网介绍(四)
  5. 如何在mac上安装docker(五)
  6. 如何在window上安装docker(六)
  7. 如何在mac上通过vagrant安装虚拟机(七)
  8. 如何在window上通过vagrant安装虚拟机(八)
  9. docker-Machine的本地使用(九)
  10. docker-Machine的本地使用(十)
  11. 在linux/mac下通过Docker-Machine在阿里云上的使用(11)
  12. docker架构和底层技术(12)
  13. docker Image概述(13)
  14. 手动建立一个base Image(14)
  15. 什么是Container(15)
  16. 构建自己的Docker镜像(16)

image

转载于:https://blog.51cto.com/12040702/2154833

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

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

相关文章

洛谷 1165日志分析

题目描述 M 海运公司最近要对旗下仓库的货物进出情况进行统计。目前他们所拥有的唯一记录就是一个记录集装箱进出情况的日志。该日志记录了两类操作&#xff1a;第一类操作为集装箱入库操作&#xff0c;以及该次入库的集装箱重量&#xff1b;第二类操作为集装箱的出库操作。这些…

KestrelServer详解[1]:注册监听终结点(Endpoint)

具有跨平台能力的KestrelServer是最重要的服务器类型。针对KestrelServer的设置均体现在KestrelServerOptions配置选项上&#xff0c;注册的终结点是它承载的最重要的配置选项。这里所谓的终结点&#xff08;Endpoint&#xff09;与“路由”介绍的终结点不是一回事&#xff0c;…

php截取字符串,带中文,多余的省略号代替

function subtext($text, $length) {if(mb_strlen($text, utf8) > $length) {return mb_substr($text, 0, $length, utf8)....;} else {return $text;}}$str 我们是family happy family; echo subtext($str,5); //我们是fa...

数据库添加

<body><form action"herozhuce.php" method"post"> <div>账号<input type"text" name"account"/></div> <div>密码<input type"text" name"password"/></div> &…

快来加入阿里云大学【云学院】班级助理招募—机会稍纵即逝,错过遥遥无期!...

2019独角兽企业重金招聘Python工程师标准>>> 如果你对云计算、大数据、云安全、人工智能领域感兴趣~ 如果你想从事与此相关的工作~~ 如果你又喜欢边交流边学习的方式~ 那么&#xff0c;加入我们吧&#xff01; 我们将为你提供一个广阔的平台&#xff0c;让你接触到云…

深入理解ajax系列第五篇——进度事件

前面的话 一般地&#xff0c;使用readystatechange事件探测HTTP请求的完成。XHR2规范草案定义了进度事件Progress Events规范&#xff0c;XMLHttpRequest对象在请求的不同阶段触发不同类型的事件&#xff0c;所以它不再需要检査readyState属性。这个草案定义了与客户端服务器通…

对象(poco)深度克隆

提供深度克隆对象功能,基于编译表达式实现&#xff0c;性能与原生代码几无差别&#xff0c;远超 json/binary 序列化实现。1. 简单示例class Person {public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }public DateTime Birth { get; s…

php将数字转化为中文大写人民币格式

<?phpfunction cny($ns) {static $cnums array("零","壹","贰","叁","肆","伍","陆","柒","捌","玖"),$cnyunits array("圆","角","分&…

BZOJ1787 [Ahoi2008]Meet 紧急集合 LCA

欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1787 题意概括 有一棵节点为n个(n≤500000)的树。接下来m次询问(m≤500000)&#xff0c;每次给出3个点 a,b,c &#xff0c;现在让你求一个点 p &#xff0c;使得 dis(p,a) dis(p,b) dis(p,c) 最…

Linux之ACL权限控制

ACL权限控制主要目的是提供传统的owner,group,other的read,wirte,execute权限之外的具体权限设置&#xff0c;可以针对单一用户或组来设置特定的权限 设置ACL权限&#xff1a;setfacl查看ACL权限&#xff1a;getfacl 比如&#xff1a;某一目录权限为 drwx------ 2 root root 40…

WIX、Squarespace、WordPress 三者的优劣分别是什么?

层出不穷的智能建站&#xff0c;模板建站&#xff0c;源码建站&#xff0c;云建站&#xff0c;仿站&#xff0c;各种建站概念都抛洒于红海之中。到底什么样的网站适合自己&#xff0c;什么样的网站值得我们去消费&#xff0c;什么样的网站能长久&#xff0c;是个非常值得思考的…

平滑的加权轮询均衡算法

前言在反向代理、路由、分布式应用调度等场景中通常都需要用到负载均衡算法&#xff0c;负载均衡的关键要点是“均衡”&#xff0c;即确保调用请求能均衡地落到多个处理节点上&#xff0c;负载均衡算法一般使用随机或轮询都可以保证均衡性。现实中由于服务器性能或资源分配的差…

php类精确验证身份证号码

<?php class check_IdCard {// $num为身份证号码&#xff0c;$checkSex&#xff1a;1为男&#xff0c;2为女&#xff0c;不输入为不验证public function checkIdentity($num, $checkSex ) { // 不是15位或不是18位都是无效身份证号if (strlen($num) ! 15 && strl…

请说说接口和抽象类的区别?

1.从使用目的来看&#xff1a; 接口只是一个类间的协议&#xff0c;它并没有规定怎么去实现&#xff1b; 抽象类可以重用你代码使你的代码更加简洁&#xff1b;2.从行为来看&#xff1a; 接口可以多继承,multi-implement 抽象类不能实例化&#xff0c;必须子类化才能实例化…

GitHub 使用

Git 是由 Linux 之父 Linus Tovalds 为了更好的管理 linux 内核开发而创立的分布是版本控制/软件管理配置软件. 简单来说, Git 管理你的 代码的历史记录 的工具. 首先注册账户 (已经完成, moveofgod) 然后, 下载一个 GitHub Desktop(mac), msisgit 客户端 (可以用命令行实现, …

LinkedHashMap 与 HashMap区别

2019独角兽企业重金招聘Python工程师标准>>> LinkedHashMap 与 HashMap区别 &#xff08;非原创&#xff09; HashMap,LinkedHashMap,TreeMap都属于Map Map 主要用于存储键(key)值(value)对&#xff0c;根据键得到值&#xff0c;因此键不允许键重复,但允许值重复。 …

C# 11 中的 file local type

C# 11 中的 file local typeIntro在之前的版本中&#xff0c;我们想要一个类型只在当前的类型中生效&#xff0c;通常我们会在一个类的内部声明一个 private 的类型以此来控制这个类型的访问权限&#xff0c;在 C# 11 中引入了一个 file local type&#xff0c;仅在声明类型的这…

PHP实现类似百度搜索自动完成(代码简单)

一、效果图: 二、HTML代码 <html lang"en"> <head><meta charset"utf-8"><title>jQuery UI 自动完成&#xff08;Autocomplete&#xff09; - 默认功能</title><link rel"stylesheet" href"/public/Auto…

Mysql读写分离php脚本

<?php/*php如何连接mysql*/ /*$link mysql_connect(‘localhost‘, ‘root‘, ‘‘);if (!$link) {die(‘Could not connect: ‘ . mysql_error());}echo ‘Connected successfully‘;mysql_close($link);*/ /*php如何选择数据库*//*$link mysql_connect(‘localhost‘, …

CentOS 搭建Postfix+Dovecot简单邮件系统

2019独角兽企业重金招聘Python工程师标准>>> 服务器信息 系统&#xff1a;CentOS 6.5 minimal版本 主机&#xff1a;虚拟机 虚拟机IP&#xff1a;192.168.128.128/24 宿主IP:10.1.79.24/24 安装postfix 注意&#xff1a;CentOS 7实际上已经用postfixSasl2代替sendma…