『中級篇』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.pswp.cn/news/282572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/282572.shtml
英文地址,請注明出處:http://en.pswp.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…