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相關(6):Dockerfile的書寫規則和指令的使用方法
Dockfile是一種被Docker程式解釋的指令碼,Dockerfile由一條一條的指令組成,每條指令對應Linux下面的一條命令。Docker程式將這些Dockerfile指令翻譯真正的Linux命令。Dockerfile有自己書寫格式和支援的命令,Dock
dockerfile相關(4):docker常用基礎映象——java映象
1. java映象 使用Java映象的最直接方法是把它作為基礎映象或執行時環境。 1.1 映象tag java:<version> 如果你不確定你需要什麼,那麼請用這個tag。它可以作為一個執行時環境,裝載你的原始碼,並啟動你的應用程
Dockerfile指令(6):USER
USER指令用於指定容器執行程式的使用者身份,預設是root使用者。在docker run中可以通過-u選項來覆蓋USER指令的設定。例如: # docker run -it -u mysql newmysqldb /bin/bash 顯示的shell提
《Linux學習並不難》Linux常用操作命令(6):uname命令顯示計算機和系統相關信息
Linux8.6 《Linux學習並不難》Linux常用操作命令(6):uname命令顯示計算機和系統相關信息 使用uname命令可以顯示計算機以及操作系統的相關信息,比如計算機硬件架構、內核發行號、操作系統名稱、計算機主機名等。 命令語法: uname [選項] 命令中各選項的
Docker(3):Dockerfile配置詳解
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命令學習(6):ps命令
bytes 釋放 ice cti width kthread hellip 名稱 pts Linux中的ps命令是Process Status的縮寫。ps命令用來列出系統中當前運行的那些進程。ps命令列出的是當前那些進程的快照,就是執行ps命令的那個時刻的那些進程,如果想要
C++傳智筆記(6):socket客戶端發送報文接受報文的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):開閉原則
思考 外部 編程人員 恰恰 單一職責 何事 適應 擴展 分享 開閉原則 定義:一個軟件實體如類、模塊和函數應該對擴展開放,對修改關閉。 問題由來:在軟件的生命周期內,因為變化、升級和維護等原因需要對軟件原有代碼進行修改時,可能會給舊代碼中引入錯誤,也可能會使我們不得不對
springBoot(6):web開發-模板引擎jsp
spring boot 一、新建工程 註意新建的工程下沒有webapp目錄eclipse下會自動創建webapp目錄這裏我們需要自動創建一個webapp目錄並創建WEB-INF。 對ServletInitializer.java進行說明 1、這個類相當於我們以前的web.xml 2、只有3.0以上才
學習用Node.js和Elasticsearch構建搜索引擎(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自學筆記(6):Linux文件系統及文件類型
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學習並不難》文件/目錄管理(6):mkdir命令創建目錄
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的交互