1. 程式人生 > >dockerfile相關(6):Dockerfile的書寫規則和指令的使用方法

dockerfile相關(6):Dockerfile的書寫規則和指令的使用方法

Dockfile是一種被Docker程式解釋的指令碼,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程式將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支援的命令,Docker程式解決這些命令間的依賴關係,類似於Makefile。Docker程式將讀取Dockerfile,根據指令生成定製的image。相比image這種黑盒子,Dockerfile這種顯而易見的指令碼更容易被使用者接受,它明確的表明image是怎麼產生的。有了Dockerfile,當我們需要定製額外的需求時,只需Dockerfile上新增或者修改指令,重新生成image即可,省去了敲命令的麻煩。
這裡寫圖片描述

Dockerfile的書寫規則和指令的使用方法

# 註釋
INSTRUCTION  argument     

指令忽略大小寫,建議使用大寫;每一行只支援一條指令,每條指令可以攜帶多個引數。Dockerfile的指令根據作用可以分為兩種:構建指令和設定指令。

構建指令(用於構建映象,其指定的操作不會在由映象執行的容器上執行)

(1) FROM(指定基礎映象)
FROM必須是第一條非註釋指令,它指定基礎映象且指定的映象是已存在的。
格式:

FROM <image>                       # 指定基礎映象

FROM <image>:<tag>
# 指定一個tag版本的基礎映象

例子:

FROM ubuntu:14.04

(2)MAINTAINER(指定映象建立者資訊)
指定映象的作者和聯絡方式資訊。
格式:

MAINTAINER <author> "e-mail"      # 指定作者名和E-mail

例子:

MAINTAINER locutus "[email protected]"   

# 執行 #docker inspect image,輸出中有相應的欄位記錄該資訊

(3)RUN(安裝軟體用)
RUN可以執行任何被基礎映象支援的命令。如基礎映象選擇了ubuntu,那麼軟體管理部分只能使用ubuntu的命令。
格式:

RUN <command> 

# shell模式,以#/bin/sh -c command 形式執行, 如RUN echo hello                                                                                 

RUN ["executable", "param1", "param2" ... ] 

# exec模式,指定其他形式的shell來執行指令 ,如RUN ["/bin/bash" ,“-c”,“echo  hello" ]

例子:

RUN apt-get update && apt-get install -y nginx     # 合併執行命令

(4)ENV(用於設定環境變數)
在映象中設定一個環境變數。
格式:

ENV  <key>  <value>      

# 設定後,後續RUN命令都可使用環境變數所輸出的指令,容器啟動ENV <key>=<value>後,通過#docker inspect檢視環境變數,也可以通過 # docker run --env key=value設定或修改環境變數。                                                         

例子:

ENV  JAVA_HOME  /path/to/java/dirent       

# 在容器中安裝JAVA程式,設定JAVA_HOME

(5)ADD COPY(將本地檔案或目錄複製到由dockerfile構建的映象中)
所有拷貝到container中的檔案和資料夾許可權為0755,uid和gid為0;如果是一個目錄,那麼會將該目錄下的所 有檔案拷貝到目錄下,不包括目錄;如果是檔案且中不使用斜槓結束,則會將視為檔案,的內容會寫入;如果是檔案且中使用斜槓結束,則會檔案拷貝到目錄下。
格式:

ADD  <src>  <dest>             

# <src>可以是檔案或目錄的本地地址(即Dockerfile所在目錄的相對路徑),也可以是一個遠端的url(docker不推薦,更建議使用wget或curl獲取檔案); <dest>是映象中的絕對路徑                                                                                                                 

ADD  ["<src>" "<dest>"]                

# 適用於檔案路徑中有空格的情況,同理有COPY的情況

COPY <src>  <dest> 

COPY ["<src>" "<dest>"] 

ADD與COPY的區別:ADD指令包含類似tar的解壓功能,而COPY只單純複製檔案。

例子 :

# vim   index.html                          # 編輯一個index.html檔案
<html>
      <head>
            <title>Page Added in Dockerfile</title>    
      </head>
      <body>
            <h1>I'm page in nginx_test1</h1>
      </body>
</html>                  

# 在Dockfile中寫下

COPY  index.html   /usr/share/nginx/html/           

# copy Dockerfile所在目錄的檔案到容器的絕對路徑下,使用docker build 指令後,執行容器,檢視埠對映,並# curl http://127.0.0.1:host_port 可以看到index.html的內容                 

設定指令(用於設定image的屬性,其指定的操作將在由image執行的容器中執行)

(6)CMD(提供容器執行的預設命令)
提供容器執行的預設命令。與RUN類似,但RUN指定的命令是在容器構建過程中執行,而CMD指定的命令是在容器執行過程中執行。該指令只能在檔案中存在一次,如果有多個,則只執行最後一條。
格式:

CMD   ["executable","param1","param2"]         # exec模式  

CMD   command param1 param2                    # shell模式 

CMD   ["param1","param2"]                      

# 當Dockerfile指定了ENTRYPOINT時使用,其作為ENTRYPOINT指令的預設引數 

例子:

# docker  run  --name  test  -d   repository  cmd                   //構建容器中的CMD指令被run的cmd覆蓋,不會執行

# docker  run  --name  test  -d   repository                         //執行構建容器中的CMD指令

(7)ENTRYPOINT(提供容器執行的預設命令)
指定容器執行時執行的命令,可以多次設定,但是隻有最後一個有效。
格式:

ENTRYPOINT ["executable", "param1", "param2"]         

# exec模式

ENTRYPOINT command param1 param2                       

# shell模式  

例子:
該指令的使用分為兩種情況,一種是獨自使用,另一種和CMD指令配合使用。
a. 當獨自使用時,如果你還使用了CMD命令且CMD是一個完整的可執行的命令,那CMD指令和ENTRYPOINT會互相覆蓋,只有最後一個CMD或者ENTRYPOINT有效。構建容器中的ENTRYPOINT指令不會被run的cmd覆蓋,ENTRYPOINT指令仍會執行。

CMD   echo “Hello, World!”                         

ENTRYPOINT  ls  -l                                                          

# CMD指令將不會被執行,只有ENTRYPOINT指令被執行

b. 與CMD指令配合使用來指定ENTRYPOINT的預設引數。ENTRYPOINT指令只能使用exec模式,指定執行命令,而不能指定引數;CMD指令不是一個完整的可執行命令,僅僅是引數部分。
在Dockerfile中,寫如下內容:

FROM ubuntu  

ENTRYPOINT ["/usr/bin/nginx"]  

CMD ["-h"]       

在命令列中,執行以下命令

# docker build -t="locutus1/nginx"  .    # 構建docker映象

# docker run -p 80 --name nginx_test2 -d locutus1/nginx -g "daemon  off;"                                                             

# docker ps -l                                                           

命令# docker run 的-g “daemon off;” 指令將CMD中的-h指令覆蓋。

(8)USER(設定container容器的使用者)
設定啟動容器的使用者,預設是root使用者。
格式:

USER  user         
USER  uid
USER  user:group
USER  uid:gid
USER  user:gid
USER  uid:group  

例子:

ENTRYPOINT ["memcached"]      # 指定指令memcached的執行使用者為daemon  
USER daemon  

或  

ENTRYPOINT ["memcached", "-u", "daemon"]  

(9)EXPOSE(指定容器需要對映到宿主機的埠)
該指令會將容器中的埠對映成宿主機中的某個埠。當你需要訪問容器的時候,可以不使用容器的IP地址而是使用宿主機的IP地址和對映後的宿主機埠。要完成整個操作需要兩個步驟:
1. 在Dockerfile使用EXPOSE設定需要對映的容器埠
2. 在執行容器的時候指定-p選項和EXPOSE設定的埠,這樣EXPOSE設定的埠號會被隨機對映成宿主機器中的一個埠號。
格式:

EXPOSE <port> [<port>...]  

例子:

EXPOSE port1                         // 對映一個埠  

# docker run -p port1 image          // 執行容器使用的相應命令   
EXPOSE port1 port2 port3             //對映多個埠  

# docker  run  -p  port1  -p  port2    -p   port3  image                                       

// 執行容器使用的相應命令   

# docker run -p host_port1:port1 -p host_port2:port2 -p host_port3:port3  image    
                                                                                                                             //指定需要對映到宿主機上的某個埠號                                      

# docker port port1 containerID               

//對於一個執行的容器,可以使用docker port加上容器中需要對映的埠和容器的ID來檢視該埠號在宿主機器上的對映埠

埠對映是docker比較重要的一個功能,原因在於我們每次執行容器時容器IP地址不能指定而是在橋接網絡卡的地址範圍內隨機生成的。宿主機器的IP地址是固定的,我們可以將容器的埠的對映到宿主機的一個埠,免去每次訪問容器中的某個服務時都要檢視容器的IP的地址。

(10)VOLUME(指定掛載點)
使容器中的一個目錄具有持久化儲存資料的功能,該目錄可以被容器本身使用,也可以共享給其他容器使用。我們知道容器使用的是AUFS,這種檔案系統不能持久化資料,當容器關閉後,所有的更改都會丟失。當容器中的應用有持久化資料的需求時,可以在Dockerfile中使用該指令。
格式:

VOLUME ["<mountpoint>"]  

例子:

VOLUME ["/tmp/data"]  

執行通過該Dockerfile構建映象的容器,/tmp/data目錄中的資料在容器關閉後,裡面的資料還存在。
如果另一個容器也有持久化資料的需求,且想使用上述容器共享的/tmp/data目錄,那麼可以執行下面的命令啟動一個容器。

# docker run -it -rm -volumes-from container1 image2   /bin/bash       

//container1為第一個容器的ID,image2為第二個容器執行image的名字。    

(11)WORKDIR(切換目錄)
可以多次切換(相當於cd命令),對RUN,CMD,ENTRYPOINT生效。
格式:

WORKDIR /path/to/workdir    

// 一定要使用絕對路徑,如果使用相對路徑,那麼路徑會傳遞下去

WORKDIR   a
WORKDIR   b
WORKDIR   c                                                                   

// 相當於#cd /a/b/c                       

例子:在Dockerfile中寫入以下

WORKDIR /path/to/p1   
WORKDIR p2   
RUN  vim a.txt                                                                

// 在/p1/p2下,執行# vim a.txt  

(12)ONBUILD(映象觸發器)
當一個映象被其他映象作為基礎映象執行時,新的映象會在構建過程中插入ONBUILD觸發器中的指令
格式:

ONBUILD <Dockerfile關鍵字>                    

// ONBUILD指定的命令在由Dockerfile構建原映象時並不執行,而是在由原映象被其他映象作為基礎映象構建時執行 

例子:

# vim Dockerfile
...
ONBUILD COPY index.html /usr/share/nginx/html/                   
...

# docker build -t="locutus1/nginx4"  .                                          //構建原映象locutus1/nginx4

# docker run -p 81 --name nginx4 locutus1/nginx4

# curl http://127.0.0.1:host_port                         
// 依舊是原來nginx的內容,說明在構建時雖然顯示,但沒有                                                                                                                執行 ONBUILD  COPY  index.html   /usr/share/nginx/html/


# vim Dockerfile                                                                          

FROM locutus1/nginx4                                          
// 原映象locutus1/nginx4作為locutus1/nginx5的基礎映象
... 

# docker build -t="locutus1/nginx5" .                     
//在step0後,執行了觸發器的指令COPY                                                                                         

# docker run -p 82 --name nginx4 locutus1/nginx5

# curl http://127.0.0.1:host_port                               
//是COPY指令所複製的index.html的內容了

相關推薦

dockerfile相關6Dockerfile書寫規則指令的使用方法

Dockfile是一種被Docker程式解釋的指令碼,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程式將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支援的命令,Dock

dockerfile相關4docker常用基礎映象——java映象

1. java映象 使用Java映象的最直接方法是把它作為基礎映象或執行時環境。 1.1 映象tag java:<version> 如果你不確定你需要什麼,那麼請用這個tag。它可以作為一個執行時環境,裝載你的原始碼,並啟動你的應用程

Dockerfile指令6USER

USER指令用於指定容器執行程式的使用者身份,預設是root使用者。在docker run中可以通過-u選項來覆蓋USER指令的設定。例如: # docker run -it -u mysql newmysqldb /bin/bash 顯示的shell提

《Linux學習並不難》Linux常用操作命令6uname命令顯示計算機系統相關信息

Linux8.6 《Linux學習並不難》Linux常用操作命令(6):uname命令顯示計算機和系統相關信息 使用uname命令可以顯示計算機以及操作系統的相關信息,比如計算機硬件架構、內核發行號、操作系統名稱、計算機主機名等。 命令語法: uname [選項] 命令中各選項的

Docker3Dockerfile配置詳解

FROM  : 指定base映象 MAINTAINER :設定映象的作者,可以是任意的字串 COPY :將檔案從build context 複製到映象             COPY 支援兩種形式:CO

Docker 學習筆記Docker 基本命令 Dockerfile build 一個 JDK 映象

本文件為學習筆記,部分內容將持續更新。 注:本人信仰用最簡單的方式去做一些事,怎麼簡單怎麼來,也許不求甚解。 Docker 基本命令 docker version 獲取 docke

Docker學習筆記Dockerfile及多步驟構建映象

## Dockerfile指令 官方文件地址:https://docs.docker.com/engine/reference/builder/ Dockerfile是一個文字格式的配置檔案,其內容包含眾多指令,使用者可以使用它快速的建立自定義映象。 ### 部分指令列表 指令|作用|備註 -|-|- FRO

linux命令學習6ps命令

bytes 釋放 ice cti width kthread hellip 名稱 pts Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要

C++傳智筆記6socket客戶端發送報文接受報文的api接口

內存泄露 rcp 分配內存 strcpy light cpp tac 第三方 _file__ #define _CRT_SECURE_NO_WARNINGS #include "stdio.h" #include "stdlib.h" #include "string.

Windows Phone開發6處理屏幕方向的改變

cati sources mon stack mar ber XML break pac 俺們都知道,智能手機可以通過旋轉手機來改變屏幕的顯示方向,更多的時候,對於屏幕方向的改變,我們要做出相應的處理,例如,當手機屏幕方向從縱向變為橫向時,可能要重新排列頁面上的控件以適應顯

設計模式六大原則6開閉原則

思考 外部 編程人員 恰恰 單一職責 何事 適應 擴展 分享 開閉原則 定義:一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。 問題由來:在軟件的生命周期內,因為變化、升級和維護等原因需要對軟件原有代碼進行修改時,可能會給舊代碼中引入錯誤,也可能會使我們不得不對

springBoot6web開發-模板引擎jsp

spring boot 一、新建工程 註意新建的工程下沒有webapp目錄eclipse下會自動創建webapp目錄這裏我們需要自動創建一個webapp目錄並創建WEB-INF。 對ServletInitializer.java進行說明 1、這個類相當於我們以前的web.xml 2、只有3.0以上才

學習用Node.jsElasticsearch構建搜索引擎6實際項目中常用命令使用記錄

nds 黃色 ati cat htm action last shard open 1、檢測集群是否健康。 curl -XGET ‘localhost:9200/_cat/health?v‘#後面加一個v表示讓輸出內容表格顯示表頭 綠色表示一切正常,黃色表示所有

EasyPR源碼剖析6車牌判斷之LBP特征

extend 順序 位置 feature tput ray bpf range str 一、LBP特征 LBP指局部二值模式,英文全稱:Local Binary Pattern,是一種用來描述圖像局部特征的算子,LBP特征具有灰度不變性和旋轉不變性等顯著優點。 原始的LBP

python函數6內置函數匿名函數

a20 *args -s 執行 code str 思維導圖 inpu 其他 我們學了這麽多關於函數的知識基本都是自己定義自己使用,那麽我們之前用的一些函數並不是我們自己定義的比如說print(),len(),type()等等,它們是哪來的呢? 一、內置函數 由pytho

Linux自學筆記6Linux文件系統及文件類型

linux文件類型 linux文件系統 Linux的文件系統:跟文件系統(rootfs)root filesystem LSB,FHS:linux發行標準1 bin boot dev etc home lib lib64 media mnt opt proc root run

《Linux學習並不難》用戶管理6刪除Linux用戶賬戶

Linux 用戶 userdel 9.6 《Linux學習並不難》用戶管理(6):刪除Linux用戶賬戶 使用userdel命令可以在Linux系統中刪除用戶賬戶,甚至連用戶的主目錄也一起刪除。命令語法:userdel [選項] [用戶名]命令中各選項的含義如表所示。選項 選項含

《Linux學習並不難》文件/目錄管理6mkdir命令創建目錄

Linux mkdir 目錄 7.6 《Linux學習並不難》文件/目錄管理(6):mkdir命令創建目錄使用mkdir命令可以在Linux系統中創建目錄。 命令語法:mkdir [選項] [目錄]命令中各選項的含義如表所示。選項 選項含義 -m <權限模式>對新創建的目錄設置權限

Exchange 2016與國內版O365混合部署6混合後的操作驗證

分享圖片 In 報告 mailbox inf 通訊錄 png 完成後 動手 雲端和本地統一的通訊錄: AAD Connect 目錄同步後,登錄O365管理員界面查看用戶,可以看到本地的兩個用戶已經同步上來了,同步類型顯示已與AD同步。 登錄一個雲端用戶的郵箱,在收件人處輸

Python從菜鳥到高手6獲取用戶輸入、函數與註釋

依次 都是 正弦 .cn 應該 asc pri 控制臺 html 1. 獲取用戶輸入   要編寫一個有實際價值的程序,就需要與用戶交互。當然,與用戶交互有很多方法,例如,GUI(圖形用戶接口)就是一種非常好的與用戶交互的方式,不過我們先不討論GUI的交互