[Dockerfile構建映象]

劉較瘦丫發表於2021-06-27

[Dockerfile構建映象]

構建映象

構建映象的特徵(前提)


1、需要基礎環境
2、可執行命令
3、啟動命令

Dockerfile


	Dockerfile 由一行行命令語句組成, 並且支援以 # 開頭的註釋行。一般而言, Dockerfile 主體內容分為四 部分:基礎映象資訊、 維護者資訊、 映象操作指令和容器啟動時執行指令。
	
	Docker 以從上到下的順序執行 Dockerfile 的指令。為了指定基本映像,第一條指令必須是 FROM。一個聲 明以#字元開頭則被視為註釋。可以在 Docker 檔案中使用 RUN,CMD,FROM,EXPOSE,ENV 等指令。

	1、Dockerfile命名:Dockerfile
	
	2、Dockerfile是由指令組成(Dockerfile指令必須大寫)
	
	3、實現基礎環境:FROM
	
	4、可執行命令:RUN
	
	5、啟動命令(指定命令必須執行在前臺):CMD # 映象啟動後執行的命令
	
	6、開始構建:docker build -t [映象名稱] . ( . 指代的就是Dockerfile檔案所在路徑)
	
	7、docker build --no-cache 是禁止構建映象使用快取
	

Dockerfile指令

FROM :指定基礎映象


以什麼映象為基礎來構建自己的映象,必須指定 

格式:

    FROM <image> 
    FROM <image>:<tag> 
    FROM <image>@<digest> 
    
示例: 

	FROM mysql:5.6 

注: tag 或 digest 是可選的,如果不使用這兩個值時,會使用 latest 版本的基礎映象

MAINTAINER :維護者資訊


可以備註一些資訊,名字、聯絡方式等等一些資訊,可以不寫

格式:

    MAINTAINER <info> 

示例:

    MAINTAINER username 
    MAINTAINER username@163.com 
    MAINTAINER Jusername username@163.com

RUN :執行一個命令


	構建映象的時候,執行什麼命令!執行的命令結果可以在構建的映象中體現。
	
	如果 執行 echo 命令,則會構建映象中 列印 echo 列印的資訊,也可以安裝一些 rpm 包,映象啟動後,容器中就會帶有安裝好的 rpm 。

格式:
 
    RUN <command>	

注意:
	
	RUN 的每次執行應該是以根目錄為當前位置
	
	RUN 指令建立的中間映象會被快取,只要不改變並會在下次構建中使用。如果不想使用這些快取映象,可以在構建 時指定--no-cache 引數,如:docker build --no-cache
		

CMD:設定一個啟動命令


構建的映象 run 後呼叫,也就是在容器啟動時才進行呼叫

格式:

	CMD command(執行的命令)
	
注: 

	CMD 不同於 RUN,CMD 用於指定在容器啟動時所要執行的 命令,而RUN 用於映象指定構建時所要執行的命令。

WORKDIR:設定工作目錄


容器啟動後,預設所在的目錄位置,進入容器就在這個目錄

格式:

	WORKDIR /path/to/workdir

示例:

    WORKDIR /a (這時工作目錄為/a) 
    WORKDIR b (這時工作目錄為/a/b) 
    WORKDIR c (這時工作目錄為/a/b/c)
	
注:

	通過 WORKDIR 設定工作目錄後,Dockerfile 中其後的命令 RUN、CMD、ENTRYPOINT、ADD、COPY 等命令都會在該目錄下執行。在使用 docker run 執行容器時,可以通過-w 引數覆蓋構建時所設定的工作目錄。
	

ENV:設定容器內預設的環境變數


格式:

	ENV <key> <value> 
	#<key>之後的所有內容均會被視為其<value>的組成部分,因此,一次只能設定 一個變數
	
	ENV <key>=<value> ... 
	#可以設定多個變數,每個變數為一個"<key>=<value>"的鍵值對,如果 <key>中包含空格,可以使用\來進行轉義,也可以通過""來進行標示;另外,反斜線也可以用於續行

示例:
	
	ENV myName liudehua
	ENV myName=wuyanzu
	

EXPOSE:指定於外界互動的埠


對外暴露(開放)的埠 可以跟多個埠 也可指定協議 

格式:

	EXPOSE <port> [<port>...多個埠號]
	
示例:

	EXPOSE 80 
	EXPOSE 8080 9998
	EXPOSE 11211/tcp 11211/udp
	
注:

	EXPOSE 並不會讓容器的埠訪問到主機。要使其可訪問,需要在 docker run 執行容器時通過-p 來 釋出這些埠,或通過-P 引數來發布 EXPOSE 匯出的所有埠.
	如果不使用EXPOSE指定埠,使用-大P也不會對映埠,只有-小p才能指定埠
	

VOLUME : 指定儲存卷


格式:

	VOLUME ["/path/to/dir"]
	
示例:

	VOLUME ["/data", "/var/log", "/mnt"]
	
注:
	
	還是需要 -v 對映掛載才可以使用,VOLUME 指定的是容器的路徑,有個提示的作用,告訴我們需要掛載到容器內哪些目錄來使用這個映象。

檢視掛載點


df -h

ARG : 指定執行時變數


用於指定構建映象中執行的變數

格式:

	ARG 變數名=預設的變數值(可以不寫)
	
示例:

	ARG NAME
	ARG username=liudehua
	
使用場景:
	
	定義一個構建映象的模板,不知道以後要裝什麼東西,可以先在構建映象的Dockerfile檔案裡面定義變數名,構建映象的時候傳入引數(自己想要安裝的rmp包名),比較方便。

ONBUILD : 觸發器


噹噹前的映象作為基礎映象時執行

格式: 
	
	ONBUILD 指令(ADD、RUN之類的)
	
示例:

	ONBUILD ADD . /app/src
	ONBUILD RUN rm -rf / 
    
注:

	構建自己的映象的時候,在構建映象的檔案中加入ONBUILD 指令,這樣你構建的映象被人當作基礎映象時候的時候,就會觸發你設定的ONBUILD 指令。如果不想別人使用你的映象,便可以這樣操作。

ADD:新增檔案到映象


可以把本地的檔案新增到映象中,tar 型別檔案會自動解壓。也可以訪問網路資源,但是網路壓縮資源不會被解壓

格式:

	ADD hom* /mydir/ 	 # 支援使用 * 表示hom開頭的都新增
	ADD hom?.txt /mydir/ # hom開頭 .txt結尾的都新增
	ADD 宿主主機路徑 映象路徑 

COPY:複製檔案到映象


功能類似 ADD,但是是不會自動解壓檔案,也不能訪問網路資源

語法:

	COPY 宿主主機路徑 映象路徑

提示:

	指令邏輯和 ADD 十分相似,映象路徑可以是一個絕對路徑,也可以是相對路徑(相對路徑的物件是WORKDIR的路徑)。
	

ADDCOPY之間的區別<

	1、ADD 支援解壓(tar型別的壓縮包),COPY不支援
		
		ADD 從宿主主機新增到容器目錄裡面的檔案如果是壓縮包,ADD新增到容器中會自動解壓,COPY則不會自動解壓,COPY新增什麼就是什麼。
		
	2、ADD支援網路下載(不支援解壓),COPY不支援
	
		COPY 後面第一個引數跟 URL 會直接提示來源不能是一個 URL ,ADD 則可以下載 網路資源,支援網路的下載 ,但是下載是壓縮檔案也不會自動解壓。
	
	3、ADD和COPY : 當映象中目錄不存在時,需要加/結尾。當映象中目錄存在時,則沒有區別。
	
		如果映象目錄不存在,也沒有 / 結尾,宿主主機的檔案,會在容器中改成映象指定目錄的名字。如果映象目錄最後 / 結尾,宿主主機的檔案則會在容器的映象指定目錄下,也就是說 / 結尾 容器中如果不存在映象指定目錄,會先建立目錄,然後再把宿主的檔案放在目錄下。

Dockerfile 構建映象案例


FROM centos7   # 基礎映象

MAINTAINER Alvin alvincy@qq.com # 備註資訊

RUN mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
# 執行指令  

RUN curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo # 執行指令

RUN yum makecache  # 執行指令

RUN yum update -y  # 執行指令

RUN yum install python3 -y  # 執行指令

RUN pip3 install django  # 執行指令

COPY docker /root/docker  # 複製宿主主機目錄 到 映象

WORKDIR /root/docker  # 設定容器的預設目錄
 
EXPOSE 8080  # 對外開放埠

CMD ["python3", "manage.py", "runserver", "0.0.0.0:8080"] # 設定啟動命令

docker build 開始構建映象


docker build 引數  PATH | URL | -

其中PATH代表含有Dockfile的目錄,當然也可以是URL中含有Dockerfile

常用引數:

    -t  --tag list  指定生成映象標籤,格式為name:tag
    	
    	docker bulid -t django:998 .
    
    -f, --file string  單獨指定Dockerfile檔案位置
    
    	docker build -t django:998 -f mysql(構建映象使用的檔名) .
    
    --build-arg list  設定構建時的變數
    
    	docker build --build-args=NAME=liudehua
    	docker build --build-args=STR='python3 httpd-tools'
    
    --no-cache  構建映象時候不使用快取
    

相關文章