Docker Dockerfile詳解

一、什么是Dockerfile

Dockerfile是一個包含用于組合映像的命令的文本文檔。可以使用在命令行中調用任何命令。 Docker通過讀取Dockerfile中的指令自動生成映像。

docker build命令用于從Dockerfile構建映像。可以在docker build命令中使用-f標志指向文件系統中任何位置的Dockerfile。

例:docker build -f /path/to/a/Dockerfile

二、Dockerfile注意事項

  • Dockerfile中所用的所有文件應Dockerfile文件在同一級父目錄下,可以為Dockerfile父目錄的子目錄
  • 2.Dockerfile中相對路徑默認都是Dockerfile所在的目錄
  • 3.Dockerfile中一定要惜字如金,能寫到一行的指令,一定要寫到一行,原因是分層構建,聯合掛載這個特性。Dockerfile中每一條指令被視為一層
  • 4.Dockerfile中指明大寫(約定俗成)

三、Dockerfile指令介紹

1、FROM

功能為指定基礎鏡像,并且必須是第一條指令。如果不以任何鏡像為基礎,那么寫法為FROM scratch。同時意味著接下來所寫的指令將作為鏡像的第一層開始

#語法:
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest> 
#其中<tag>和<digest> 是可選項,默認值為latest

2、MAINTAINER

指定作者(新版docker中使用LABEL指明)

#語法
MAINTAINER <name>

3、LABEL

為鏡像指定標簽(LABEL會繼承基礎鏡像種的LABEL,如遇到key相同,則值覆蓋)

#語法:
LABEL <key>=<value> <key>=<value> <key>=<value> ...
#一個Dockerfile種可以有多個LABEL,換行可使用\符號
#如下:
LABEL key1="value1" \
key2="value2" \
key3="value3"

4、ADD

一個復制命令,把文件復制到鏡像中。類似于Linux系統中的scp命令,只是scp需要加用戶名和密碼的權限驗證,而ADD不用。

#語法
ADD file PATH/
#- 路徑的填寫可以是容器內的絕對路徑,也可以是相對于工作目錄的相對路徑,推薦寫成絕對路徑
#- 可以是一個本地文件或者是一個本地壓縮文件,還可以是一個url
#- 如果把寫成一個url,那么ADD就類似于wget命令

5、COPY

復制命令,COPY的只能是本地文件,其他用法與ADD一致

6、EXPOSE

功能為暴漏容器運行時的監聽端口給外部,但是EXPOSE并不會使容器訪問主機的端口,如果想使得容器與主機的端口有映射關系,必須在容器啟動的時候加上 -P參數

#語法
EXPOSE <port>/<tcp/udp>

7、ENV

設置環境變量

 #語法有兩種ENV <key> <value>ENV <key>=<value> ...#兩者的區別就是第一種是一次設置一個,第二種是一次設置多個

8、在Dockerfile中使用變量的方式

 $varname${varname}${varname:-default value}$(varname:+default value}#第一種和第二種相同#第三種表示當變量不存在使用-號后面的值#第四種表示當變量存在時使用+號后面的值(當然不存在也是使用后面的值)

9、RUN

功能為運行指定的命令
RUN命令有兩種格式

# 語法有兩種
RUN <command>
RUN ["executable", "param1", "param2"]
#第一種后邊直接跟shell命令
#- 在linux操作系統上默認 /bin/sh -c
#- 在windows操作系統上默認 cmd /S /C
#第二種是類似于函數調用。
#- 可將executable理解成為可執行文件,后面就是兩個參數。

10、CMD

功能為容器啟動時默認命令或參數

#語法有三種寫法
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
#第三種比較好理解了,就時shell這種執行方式和寫法
#第一種和第二種其實都是可執行文件加上參數的形式

11、RUN&&CMD

#RUN是構件容器時就運行的命令以及提交運行結果
#CMD是容器啟動時執行的命令,在構件時并不運行,構件時緊緊指定了這個命令到底是個什么樣子

12、ENTRYPOINT

容器啟動時運行得啟動命令

#語法
ENTRYPOINT ["executable", "param1", "param2"]  
ENTRYPOINT command param1 param2
#- 第二種就是寫shell
#- 第一種就是可執行文件加參數

與CMD比較:

相同點:

  • 只能寫一條,如果寫了多條,那么只有最后一條生效

  • 容器啟動時才運行,運行時機相同

不同點:

  • ENTRYPOINT不會被運行的command覆蓋,而CMD則會被覆蓋
  • 如果我們在Dockerfile種同時寫了ENTRYPOINT和CMD,并且CMD指令不是一個完整的可執行命令,那么CMD指定的內容將會作為ENTRYPOINT的參數

13、VOLUME

可實現掛載功能,可以將宿主機目錄掛載到容器中,可用專用的文件存儲當作Docker容器的數據存儲部分,一般的使用場景為需要持久化存儲數據時,容器使用的是AUFS,這種文件系統不能持久化數據,當容器關閉后,所有的更改都會丟失。所以當數據需要持久化時用這個命令。

#語法
VOLUME ["/data"]
#["/data"]可以是一個JsonArray ,也可以是多個值。所以如下幾種寫法都是正確的

14、USER

設置啟動容器的用戶,可以是用戶名或UID

# 語法有兩種
USER daemo
USER UID

注意:如果設置了容器以daemon用戶去運行,那么RUN, CMD 和 ENTRYPOINT 都會以這個用戶去運行,使用這個命令一定要確認容器中擁有這個用戶,并且擁有足夠權限

15、WORKDIR

設置工作目錄,對RUN,CMD,ENTRYPOINT,COPY,ADD生效。如果不存在則會創建,也可以設置多次

#語法
WORKDIR /path/to/workdir

16、ARG

設置變量命令,ARG命令定義了一個變量,在docker build創建鏡像的時候,使用 --build-arg =來指定參數

語法
ARG <name>[=<default value>]

如果用戶在build鏡像時指定了一個參數沒有定義在Dockerfile種,那么將有一個Warning

17、ONBUILD

#語法
ONBUILD [INSTRUCTION]

這個命令只對當前鏡像的子鏡像生效。

比如當前鏡像為A,在Dockerfile種添加:

ONBUILD RUN ls -al

這個 ls -al 命令不會在A鏡像構建或啟動的時候執行

此時有一個鏡像B是基于A鏡像構建的,那么這個ls -al 命令會在B鏡像構建的時候被執行。

18、STOPSIGNAL

當容器停止時給系統發送什么樣的指令,默認是15

#語法
STOPSIGNAL signal

19、HEALTHCHECK

容器健康狀況檢查命令

# 語法有兩種
HEALTHCHECK [OPTIONS] CMD command
HEALTHCHECK NONE
#第一個的功能是在容器內部運行一個命令來檢查容器的健康狀況
#第二個的功能是在基礎鏡像中取消健康檢查命令
#[OPTIONS]的選項支持以下三中選項:
#- –interval=DURATION 兩次檢查默認的時間間隔為30秒
#- –timeout=DURATION 健康檢查命令運行超時時長,默認30秒
#- –retries=N 當連續失敗指定次數后,則容器被認為是不健康的,狀態為unhealthy,默認次數是3

注意:

HEALTHCHECK命令只能出現一次,如果出現了多次,只有最后一個生效。

CMD后邊的命令的返回值決定了本次健康檢查是否成功,具體的返回值如下:

  • 0: success - 表示容器是健康的
  • 1: unhealthy - 表示容器已經不能工作了
  • 2: reserved - 保留值

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535655.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535655.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535655.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

公司臺灣主站的url重寫

今天對公司臺灣主站的url地址進行優化.主站采用的是joomla,而joomla初建好后用的url對搜索引擎非常的不友好. Joomla中的SEF說白了就是一個對URL的重寫的過程將原來參數眾多&#xff0c;層次很深的URL改寫為一個簡單的更容易被記住被搜索的URL。通過分析Joomla站點的URL結果就…

編寫第一個Spring程序——IOC實現

第一個Spring程序 IOC范例 1、新建maven工程 2、在pom.xml文件中導入相關jar包 <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core&l…

改變centos系統的時區

兩條命令都可以: 1.timeconfig 2.tzselect

分布式文件系統:原理、問題與方法

本地文件系統如ext3&#xff0c;reiserfs等&#xff08;這里不討論基于內存的文件系統&#xff09;&#xff0c;它們管理本地的磁盤存儲資源、提供文件到存儲位置的映射&#xff0c;并抽象出一套文件訪問接口供用戶使用。但隨著互聯網企業的高速發展&#xff0c;這些企業對數據…

編寫第二個Spring程序——AOP實現

第二個Spring程序 AOP范例 1、新建maven工程 2、在pom.xml文件導入相關jar包 <!-- https://mvnrepository.com/artifact/org.springframework/spring-core --><dependency><groupId>org.springframework</groupId><artifactId>spring-core<…

linux高負載下徹底優化mysql數據庫

同時在線訪問量繼續增大 對于1G內存的服務器明顯感覺到吃力嚴重時甚至每天都會死機 或者時不時的服務器卡一下 這個問題曾經困擾了我半個多月MySQL使用是很具伸縮性的算法&#xff0c;因此你通常能用很少的內存運行或給MySQL更多的被存以得到更好的性能。 安裝好mysql后&#x…

Java注釋說明以及IDEA中的快捷鍵

一、單行注釋 說明&#xff1a;單行注釋 一般注釋少量的代碼或者說明內容 格式&#xff1a;//注釋的內容 IDEA中的快捷鍵&#xff1a;使用Ctrl /&#xff0c; 添加行注釋&#xff0c;再次使用&#xff0c;去掉行注釋 二、多行注釋 說明&#xff1a;多行注釋 一般注釋大量的…

redhat系統雙網卡綁定

Redhat Linux的網絡配置&#xff0c;基本上是通過修改幾個配置文件來實現的&#xff0c;雖然也可以用ifconfig來設置IP&#xff0c;用route來配置默認網關&#xff0c;用hostname來配置主機名&#xff0c;但是重啟后會丟失。 1.相關的配置文件: /ect/hosts 配置主機名和IP地址…

JDK源碼解析之java.util.Iterator和java.lang.Iterable

在Java中&#xff0c;我們可以對List集合進行如下幾種方式的遍歷&#xff1a;第一種就是普通的for循環&#xff0c;第二種為迭代器遍歷&#xff0c;第三種是for each循環。后面兩種方式涉及到Java中的iterator和iterable對象&#xff0c;接下來我們通過源碼來看看這兩個對象的區…

為了讓你的網頁能在更多的服務器上正常地顯示,還是加上“SET NAMES UTF8”吧

Repinted:http://blog.csdn.net/class1/archive/2006/12/30/1469298.aspx 為了讓你的網頁能在更多的服務器上正常地顯示&#xff0c;還是加上“SET NAMES UTF8”吧(可以根據你的喜歡選擇相應的編碼,如gb2312)&#xff0c;即使你現在沒有加上這句也能正常訪問。 先說MySQL的字…

WebLogic11g 安裝配置規范

目錄 1 文檔控制... 3 1.1 修改記錄... 3 1.2 分發者... 3 1.3 審閱記錄... 3 1.4 相關文檔... 3 2 安裝準備... 4 2.1 安裝前需要開發單位提供的信息... 4 2.2 本地磁盤空間配置規范... 4 2.3 版本要求規范... 4 2.4 weblogic部署配置規范... 5 2.4.1操作系統要求.…

JDK源碼解析之java.util.ListIterator

ListIterator是一個功能更加強大的迭代器接口, 它繼承于Iterator接口,只能用于各種List類型的訪問。可以通過調用listIterator()方法產生一個指向List開始處的ListIterator, 還可以調用listIterator(n)方法創建一個一開始就指向列表索引為n的元素處的ListIterator。 一、源碼解…

VsFTP出現500 OOPS: cannot change directory的解決辦法

cannot change directory:/home/*** ftp服務器連接失敗,錯誤提示:500 OOPS: cannot change directory:/home/*******500 OOPS: child died解決方法:在終端輸入命令&#xff1a;setsebool ftpd_disable_trans 1 service vsftpd restart就&#xff2f;&#xff2b;了&#xff01;…

Oracle的reman命令

list命令&#xff1a; list backupset summary 列出概要信息 list backupset by file list archivelog all 列出所有歸檔日志 list backupset tag 00列出標簽信息 list backupset 8 列出8號…

Ubuntu root賬號的使用

第一次安裝好Ubuntu后&#xff0c;root帳號不能用。在安裝期間創建的第一個用戶對系統有管理權&#xff0c;通過“sudo”能象root運行程序.使用時僅需它的普通用戶密碼。例如: sudo apt-get update  如果你希望像傳統 UNIX 樣式使用root帳號。你能通過輸入 sudo passwd root …

JDK源碼解析之Java.util.Collection

Collection是單例集合的頂層接口&#xff0c;它表示一組對象&#xff0c;這些對象也稱為Collection的元素&#xff0c;JDK 不提供此接口的任何直接實現&#xff0c;它提供更具體的子接口&#xff08;如Set和List&#xff09;實現 一、源碼解析 1、接口定義 public interface …

Vim 命令操作

vim命令操作命令模式dd 編輯模式 末行模式 1.地址定界&#xff1a; startpos,endpos #:特定的第#行&#xff0c;例如S即第5行;:當前行;$:最后一行; #,#:指定行范圃,左側起始行&#xff0…

JDK源碼解析之Java.util.Collections

java.util.Collections 是一個包裝類。它包含有各種有關集合操作的靜態多態方法。此類不能實例化&#xff0c;就像一個工具類,服務于Java的Collection框架。 一、源碼解析 1、不可實例化 private Collections() {}Collections是util包中一個不可實例化的類。 2、優化參數 pri…

ubuntu下安裝jdk

安裝1.5 sudo apt-get install sun-java5-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 安裝1.6 sudo apt-get install sun-java6-jdk sudo update-alternatives --config java sudo update-alternatives --config javac 轉載:http:/…

使用validate驗證數據庫

驗證數據備份集是不是可以用來做恢復和數據文件是否損壞、壞塊 三種方式&#xff1a; 1.validate validate database ;validate tablespace users; validate datafile 1; validate archivelog all validate datafile 1 block 10; validate backupset 28; db…