欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Docker中Dockerfile制作鏡像的方法步驟

 更新時(shí)間:2022年01月20日 11:06:37   作者:rightlzc  
本文主要介紹了Dockerfile制作鏡像的方法步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

docker 鏡像的制作,可以基于容器創(chuàng)建鏡像,也可基于 dockerfile 構(gòu)建鏡像。但需要注意的是,我們并不是真正"創(chuàng)建"新鏡像,而是基于一個(gè)已有的基礎(chǔ)鏡像,如 centos 或 ubuntu 等,構(gòu)建新鏡像而已。

1.基于容器制作

聯(lián)合文件系統(tǒng)(UnionFS)掛載提供了容器的文件系統(tǒng),任何對(duì)容器內(nèi)文件系統(tǒng)的改動(dòng)都會(huì)被寫入到新的文件層中,這個(gè)文件層歸創(chuàng)建它的容器所有。而我們就對(duì)做出改動(dòng)的容器進(jìn)行鏡像構(gòu)建。我這兒使用 busybox 作為 base image,我們可以認(rèn)為 busybox 為一個(gè)精簡(jiǎn)的 linux 系統(tǒng)。在 busybox 上運(yùn)行一個(gè) httpd 程序,并將其制作為鏡像文件。

1.拉取鏡像

~]# docker image pull busybox:latest		#默認(rèn)會(huì)從dockerhub上拉取
...
~]# docker image ls
	REPOSITORY    TAG       IMAGE ID        CREATED             SIZE
	busybox      latest    59788edf1f3e    2 months ago        1.15MB

2.運(yùn)行鏡像

~]# docker container run --name bbox -it busybox:latest		#啟動(dòng)鏡像,并交互式登錄

3.運(yùn)行httpd
busybox 自帶有 httpd 程序

/ # httpd -h
Usage: httpd [-ifv[v]] [-c CONFFILE] [-p [IP:]PORT] [-u USER[:GRP]] [-r REALM] [-h HOME]
	   httpd -d/-e/-m STRING
        -i              Inetd mode
        -f              Don't daemonize
        -v[v]           Verbose
        -p [IP:]PORT    Bind to IP:PORT (default *:80)
        -u USER[:GRP]   Set uid/gid after binding to port
        -r REALM        Authentication Realm for Basic Authentication
        -h HOME         Home directory (default .)
        -c FILE         Configuration file (default {/etc,HOME}/httpd.conf)
        -m STRING       MD5 crypt STRING
        -e STRING       HTML encode STRING
        -d STRING       URL decode STRING

/ # mkdir /data/html		#家目錄
/ # echo "httpd server" >> /data/html/index.html		#測(cè)試頁(yè)
/ # httpd -h /data/html		#指定家目錄,啟動(dòng)服務(wù)

4.鏡像制作
新打開一個(gè)控制臺(tái)

~]# docker container commit --help
	Usage:  docker container commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
	Options:
	  -a, --author string    Author (e.g., "John Hannibal Smith <hannibal@a-team.com>")
	  -c, --change list      Apply Dockerfile instruction to the created image
	  -m, --message string   Commit message
	  -p, --pause            Pause container during commit (default true)

~]# docker container commit -p bbox test/mybbox:v0.1		#-p制作鏡像時(shí),容器暫停運(yùn)行,防止在制作鏡像時(shí)有數(shù)據(jù)寫入
~]# docker image ls
	test/mybbox      v0.1     e07687dd8546    1 minutes ago     1.15MB 

注:若是想對(duì)版本號(hào)或者鏡像名稱進(jìn)行修改,可使用docker tag命令,但是修改后不會(huì)覆蓋原鏡像,會(huì)新生成一個(gè)鏡像,類似于硬鏈接。

5.更改啟動(dòng)命令
當(dāng)我們運(yùn)行mybbox時(shí),會(huì)發(fā)現(xiàn)雖然文件都有,但是并沒(méi)有運(yùn)行httpd服務(wù),這是因?yàn)槊總€(gè)鏡像都有一個(gè)運(yùn)行時(shí)啟動(dòng)的初始命令,我們?nèi)粝腌R像啟動(dòng)時(shí)就運(yùn)行某個(gè)命令,需要我們?cè)谥谱麋R像時(shí)就指定。

~]# docker image inspect -f {{.Config.Cmd}} test/mybbox:v0.1
	[sh]						#可見 mybbox 鏡像還是使用 busybox 的初始命令。

~]# docker container commit -a "test <test@docker.com>" -c 'CMD ["/bin/httpd,"-h /data/html"]' -p bbox test/mybbox:v0.2
~]# docker image inspect -f {{.Config.Cmd}} test/mybbox:v0.2         
	[/bin/sh -c ["/bin/httpd,"-h /data/html"]]

6.推送至倉(cāng)庫(kù)
鏡像制作完成,就可以推送至倉(cāng)庫(kù),默認(rèn)是推送到dockerhub,我們可以自己在 dockerhub 創(chuàng)建賬號(hào)并創(chuàng)建倉(cāng)庫(kù),然后本地 docker login 登錄,就可以將本地鏡像 push 上去。需要注意的是在 dockerhub 上創(chuàng)建倉(cāng)庫(kù)時(shí),命名空間要為test,倉(cāng)庫(kù)名為 mybbox(對(duì)于本次實(shí)驗(yàn)),必須要嚴(yán)格一致。由于我這兒登不了 dockerhub,就不在演示了。

7.保存鏡像至本地
當(dāng)鏡像制作好,可保存到本地進(jìn)行分發(fā),也就不需要上傳到倉(cāng)庫(kù)了。

~]# docker image save -o /tmp/mybbox.gz test/mybbox:v0.2	#-o指定保存目錄,也可多個(gè)鏡像一起保存
~]# docker image load -i /tmp/mybbox.gz 		#使用時(shí)導(dǎo)入即可

2. 基于Dockerfile制作鏡像

其實(shí)我們發(fā)現(xiàn),基于容器構(gòu)建鏡像,在對(duì)配置變動(dòng)頻繁或需要重復(fù)構(gòu)建鏡像時(shí),效率是非常低下的。所以我們就需要使用Dockerfile來(lái)實(shí)現(xiàn)快速構(gòu)建鏡像,Dockerfile是一個(gè)文件,它由構(gòu)建鏡像的指令組成,指令由Docker鏡像構(gòu)建者自上而下排列,能夠被用來(lái)修改鏡像的任何信息。

注意事項(xiàng):

  • Dockerfile文件需放置在一個(gè)目錄中,這個(gè)目錄中有構(gòu)建鏡像的所有文件,可以創(chuàng)建子目錄。
  • 在Dockerfile文件中,"#“號(hào)開頭表示注釋,每行為"INSTRUCTION arguments”,習(xí)慣大寫表示關(guān)鍵字(但并不區(qū)分大小寫),后面小寫表示值。
  • 每個(gè)Dockerfile的第一行(注釋行除外),必須使用"FROM"關(guān)鍵字。
  • 當(dāng)我們?cè)赿ocker build構(gòu)建鏡像時(shí),會(huì)將我們的指定的上下文目錄(即Dockerfile所在目錄)打包傳遞給docker 引擎,而這個(gè)上下文中并非所有文件都會(huì)在Dockerfile中使用,這樣就會(huì)使傳送給docker引擎的目錄過(guò)大,影響構(gòu)建速度,所以可以在此目錄中,定義.dockerignore文件,將不使用的文件文件名寫入到該文件即可,且支持通配符。
  • 最小化鏡像的層數(shù),Dockerfile中每一行命令就是一層,層數(shù)過(guò)多影響構(gòu)建效率。
  • Dockerfile文件中命令從上往下逐行執(zhí)行。

2.1 Dockerfile命令

1.FROM: FROM 指令是最重的一個(gè)且必須為 Dockerfile 文件開篇的第一個(gè)非注釋行,用于為映像文件構(gòu)建過(guò)程指定基準(zhǔn)鏡像,后續(xù)的指令運(yùn)行于此基準(zhǔn)鏡像所提供的運(yùn)行環(huán)境。實(shí)踐中,基準(zhǔn)鏡像可以是任何可用鏡像文件,默認(rèn)情況下,docker build 會(huì)在 docker 主機(jī)上查找指定的鏡像文件,在其不存在時(shí),則會(huì)從Docker Hub Registry 上拉取所需的鏡像文件如果找不到指定的鏡像文件,docker build 會(huì)返回一個(gè)錯(cuò)誤信息。

Syntax: 
	FROM <image>[:<tag>] 
	FROM <image>@<digest>
	
	<image> :指定作為base image的名稱,默認(rèn)從dockerhub拉取鏡像,若使用其他倉(cāng)庫(kù)可在鏡像前指定;
	<tag>	:base image的標(biāo)簽,為可選項(xiàng),省略時(shí)默認(rèn)為latest;

eg:
	FROM busybox:latest

2.MAINTAINER: 用于讓鏡像制作者提供本人的詳細(xì)信息,Dockerfile 并不限制 MAINTAINER 指令可在出現(xiàn)的位置,但推薦將其放置于 FROM 指令之后,已經(jīng)被 LABEL 取代,但仍可使用。

Syntax: 
	FROM <image>[:<tag>] 
	FROM <image>@<digest>
	
	<image> :指定作為base image的名稱,默認(rèn)從dockerhub拉取鏡像,若使用其他倉(cāng)庫(kù)可在鏡像前指定;
	<tag>	:base image的標(biāo)簽,為可選項(xiàng),省略時(shí)默認(rèn)為latest;

eg:
	FROM busybox:latest

3.LABEL: 效果同上,指定多個(gè)元數(shù)據(jù)

Syntax:
	 LABEL <key>=<value> [<key>=<value> ...]

eg:
	LABEL name=test mail=test@163.com

4.COPY: 用于從 Docker 主機(jī)復(fù)制文件至創(chuàng)建的新映像文件

Syntax:
	COPY <src> ... <dest> 
	COPY ["<src>",... "<dest>"] 

	<src>  :要復(fù)制的源文件或目錄,支持使用通配符
	<dest> :目標(biāo)路徑,即正在創(chuàng)建的image的文件系統(tǒng)路徑;
		    建議為<dest>使用絕對(duì)路徑否則,COPY指定則以WORKDIR為其起始路徑;

文件復(fù)制準(zhǔn)則:
	1.<src>必須是build上下文中的路徑,不能是其父目錄中的文件
	2.如果<src>是目錄,則其內(nèi)部文件或子目錄會(huì)被遞歸復(fù)制,但<src>目錄自身不會(huì)被復(fù)制
	3.如果指定了多個(gè)<src>,或在<src>中使用了通配符,則<dest>必須是一個(gè)目錄,且必須以/結(jié)尾
	4.如果<dest>事先不存在,它將會(huì)被自動(dòng)創(chuàng)建,這包括其父目錄路徑

eg:
	COPY index.html /data/web/		#最后不加斜線會(huì)改名為web
	COPY src/ /data/web				#src/* 被拷貝到/data/web目錄下
	COPY test1 test2 /data/web/		#多文件最后必須加/

5.ADD: ADD指令類似于 COPY 指令,ADD 支持使用 TAR 文件和 URL 路徑

Syntax:
	ADD <src> ... <dest> 
	ADD ["<src>",... "<dest>"] 

操作準(zhǔn)則:同COPY指令
	1.如果<src>為URL且<dest>不以/結(jié)尾,則<src>指定的文件將被下載并直接被創(chuàng)建為<dest>;
	  如果<dest>以/結(jié)尾,則文件名URL指定的文件將被直接下載并保存為<dest>/<filename>。
	2.如果<src>是一個(gè)本地系統(tǒng)上的壓縮格式的tar文件,它將被展開為一個(gè)目錄,其行為類似于“tar -x”命令;
	  然而,通過(guò)URL獲取到的tar文件將不會(huì)自動(dòng)展開;
	3.如果<src>有多個(gè),或其間接或直接使用了通配符,則<dest>必須是一個(gè)以/結(jié)尾的目錄路徑;
	  如果<dest>不以/結(jié)尾,則其被視作一個(gè)普通文件,<src>的內(nèi)容將被直接寫入到<dest>;

eg:
	ADD http://nginx.org/download/nginx-1.14.2.tar.gz  /data/		#nginx-1.14.2.tar.gz會(huì)放在/data/目錄下,不會(huì)解壓
	ADD nginx-1.14.2.tar.gz	/date		#nginx-1.14.2目錄會(huì)放在/data/目錄下,會(huì)解壓

6.WORKDIR: 用于為 Dockerfile 中所有的 RUN、CMD、ENTRYPOINT、COPY 和 ADD 指定設(shè)定工作目錄,其生效范圍為本次定義workdir到下一次定義之間,且還會(huì)影響到進(jìn)入容器時(shí)的目錄

Syntax:
	WORKDIR <dirpath>

注:在Dockerfile文件中,WORKDIR指令可出現(xiàn)多次,其路徑也可以為相對(duì)路徑,不過(guò),其是相對(duì)此前一個(gè)WORKDIR指令指定的路徑另外,
WORKDIR也可調(diào)用由ENV指定定義的變量

eg:
	WORKDIR /var/log
	WORKDIR $STATEPATH

7.VOLUME: 用于在 image 中創(chuàng)建一個(gè)掛載點(diǎn)目錄,以掛載 Docker host 上的卷或其它容器上的卷,但需要注意的是此選項(xiàng)只能創(chuàng)建容器管理的卷,即在宿主機(jī)上隨機(jī)掛載一個(gè)目錄,而不能指定目錄掛載

Syntax:
	VOLUME <mountpoint> 
	VOLUME ["<mountpoint>"] 

注:如果掛載點(diǎn)目錄路徑下此前有文件存在,docker run 命令會(huì)在卷掛載完成后將此前的所有文件復(fù)制到新掛載的卷中。

eg:
	VOLUME /data		#不能指定宿主機(jī)目錄,隨機(jī)掛載在 /var/lib/docker/volumes/...

8.EXPOSE: 用于為容器打開指定要監(jiān)聽的端口以實(shí)現(xiàn)與外部通信,但不能指定宿主機(jī)的端口綁定,并且即使在 Dockerfile 中定義了 EXPOSE ,也必須要在啟動(dòng)容器時(shí)手動(dòng)加上 -P 選項(xiàng)才會(huì)生效。

Syntax:
	EXPOSE <port>[/<protocol>] [<port>[/<protocol>] ...]
	<protocol>用于指定傳輸層協(xié)議,可為tcp或udp二者之一,默認(rèn)為TCP協(xié)議

eg:
	EXPOSE 11211/udp 11211/tcp	#EXPOSE指令可一次指定多個(gè)端口

9.ENV: 用于為鏡像定義所需的環(huán)境變量,并可被 Dockerfile 文件中位于其后的其它指令(如ENV、ADD、COPY等)所調(diào)用,調(diào)用格式為 $variable_name 或 ${variable_name}。

Syntax:
	ENV <key> <value> 或
	ENV <key>=<value> ...

注:
	1.第一種格式中,<key>之后的所有內(nèi)容均會(huì)被視作其<value>的組成部分,因此,一次只能設(shè)置一個(gè)變量;
	2.第二種格式可用一次設(shè)置多個(gè)變量,每個(gè)變量為一個(gè)"<key>=<value>"的鍵值對(duì),如果<value>中包含空格,可以以反斜線(\)進(jìn)行轉(zhuǎn)義,
	  也可通過(guò)對(duì)<value>加引號(hào)進(jìn)行標(biāo)識(shí);另外,反斜線也可用于續(xù)行;
	3.定義多個(gè)變量時(shí),建議使用第二種方式,以便在同一層中完成所有功能
	4.docker run時(shí)可以使用 -e 參數(shù)指定環(huán)境變量,相同環(huán)境變量會(huì)覆蓋Dockerfile中的值

eg:
	ENV name=zhang \
		age=15	\
		sex=N

10.ARG: 此參數(shù)和 ENV 有些相似,都是指定變量值,但是在使用 ENV 時(shí),若要?jiǎng)討B(tài)的傳遞變量值,只能在 docker run 時(shí)才能傳遞,而 ARG 可以在 docker build 過(guò)程中,通過(guò)–build-arg 來(lái)進(jìn)行動(dòng)態(tài)傳遞參數(shù)值。除此之外,ENV 的值會(huì)保留在鏡像的環(huán)境變量中,但 ARG 的值不會(huì)保存。所以若想在 build 鏡像的過(guò)程中修改變量的值,推薦使用 ARG

用法同上,下圖說(shuō)明了構(gòu)建過(guò)程,RUN 與 CMD 指令見下面介紹

在這里插入圖片描述

11.RUN: 用于指定 docker build 過(guò)程中運(yùn)行的命令,其可以是基礎(chǔ)鏡像中存在的任何命令,見下圖所示。

Syntax:
	RUN <command> 
	RUN ["<executable>", "<param1>", "<param2>"]

注:
	1.第一種格式中,<command>通常是一個(gè)shell命令,且以“/bin/sh -c”來(lái)運(yùn)行它,這意味著此進(jìn)程在容器中的PID不為1,不能接收Unix信號(hào),
	  因此,當(dāng)使用docker stop <container>命令停止容器時(shí),此進(jìn)程接收不到SIGTERM信號(hào);即在運(yùn)行該命令前會(huì)先起一個(gè)sh進(jìn)程,然后運(yùn)行此命令。
	2.第二種語(yǔ)法格式中的參數(shù)是一個(gè)JSON格式的數(shù)組,其中<executable>為要運(yùn)行的命令,后面的<paramN>為傳遞給命令的選項(xiàng)或參數(shù);
	  然而,此種格式指定的命令不會(huì)以“/bin/sh -c”來(lái)發(fā)起,因此常見的shell操作如變量替換以及通配符(?,*等)替換將不會(huì)運(yùn)行;
	  不過(guò),如果要運(yùn)行的命令依賴于此shell特性的話,可以將其替換為類似的格式:RUN ["/bin/bash", "-c", "<executable>", "<param1>"]

eg:
	RUN ls /data		#將會(huì)在構(gòu)建的時(shí)候執(zhí)行 "ls /data"命令
	RUN ["/bin/sh","-c","mkdir -p /data/hello"]	

12.CMD: 類似于RUN指令,CMD 指令也可用于運(yùn)行任何命令或應(yīng)用程序,不過(guò),二者的運(yùn)行時(shí)間點(diǎn)不同,RUN指令運(yùn)行于映像文件構(gòu)建過(guò)程中(docker build),而CMD指令運(yùn)行于基于 Dockerfile 構(gòu)建出的新映像文件啟動(dòng)一個(gè)容器時(shí)(docker run),CMD 指令的首要目的在于為啟動(dòng)的容器指定默認(rèn)要運(yùn)行的程序,且其運(yùn)行結(jié)束后,容器也將終止;不過(guò),CMD 指定的命令其可以被 docker run 的命令行選項(xiàng)所覆蓋,在 Dockerfile 中可以存在多個(gè) CMD 指令,但僅最后一個(gè)會(huì)生效。

Syntax:
	CMD <command> 
	CMD ["<executable>","<param1>","<param2>"] 
	CMD ["<param1>","<param2>"]

注:前兩種語(yǔ)法格式的意義同RUN,第一種用法雖然會(huì)先起sh進(jìn)程,但是執(zhí)行完command后,sh進(jìn)程會(huì)退出,并由command的進(jìn)程替代為1號(hào)進(jìn)程,第三種則用于為ENTRYPOINT指令提供默認(rèn)參數(shù)。

eg:
	CMD /bin/httpd -f -h $DOC_ROOT	#如下可見在運(yùn)行命令之前會(huì)預(yù)先運(yùn)sh命令
	~]# docker image inspect -f {{.Config.Cmd}} test
		[/bin/sh -c /bin/httpd -f -h $DOC_ROOT]

~]# docker container run --name NAME -it --rm IMAGE_NAME /bin/bash		#CMD 指定的命令可在 docker run 時(shí)指定命令修改

13.ENTRYPOINT: 類似 CMD 指令的功能,用于為容器指定默認(rèn)運(yùn)行程序,從而使得容器像是一個(gè)單獨(dú)的可執(zhí)行程序,與 CMD 不同的是,由 ENTRYPOINT 啟動(dòng)的程序不會(huì)被 docker run 命令行指定的參數(shù)所覆蓋,而且,這些命令行參數(shù)會(huì)被當(dāng)作參數(shù)傳遞給 ENTRYPOINT 指定指定的程序。不過(guò),docker run 命令的 --entrypoint 選項(xiàng)的參數(shù)可覆蓋 ENTRYPOINT 指令指定的程序。

Syntax:
	ENTRYPOINT <command>
	ENTRYPOINT ["<executable>", "<param1>", "<param2>"]

注:
	1.docker run命令傳入的命令參數(shù)會(huì)覆蓋CMD指令的內(nèi)容并且附加到ENTRYPOINT命令最后做為其參數(shù)使用。
	2.Dockerfile文件中也可以存在多個(gè)ENTRYPOINT指令,但僅有最后一個(gè)會(huì)生效。

eg:
	CMD ["/bin/ls","/etc"]
	ENTRYPOINT ["/bin/bash","-c"]		#會(huì)先啟動(dòng)sh進(jìn)程,CMD指定的命令會(huì)被當(dāng)做參數(shù)傳給 /bin/bash -c
	
~]# docker container run --name NAME -it --rm IMAGE_NAME /bin/bash		#使用entrypoint時(shí),docker run時(shí)動(dòng)態(tài)指定的命令將會(huì)被當(dāng)做參數(shù)傳遞給entrypoint定義的命
~]# docker container run --name NAME -it --rm --entrypoint "/bin/bash" IMAGE_NAME	#entrypoint指定的命令可以在docker run時(shí)添加的 --entrypoint 后的命令所覆蓋 

14.USER: 用于指定運(yùn)行image時(shí)的或運(yùn)行 Dockerfile 中任何 RUN、CMD 或 ENTRYPOINT 指令指定的程序時(shí)的用戶名或 UID,默認(rèn)情況下,container 的運(yùn)行身份為root用戶。

Syntax:
	USER <UID>|<UserName>

	注:需要注意的是,<UID>可以為任意數(shù)字,但實(shí)踐中其必須為/etc/passwd中某用戶的有效UID,否則,docker run命令將運(yùn)行失敗。

15.HEALTHCHECK: 對(duì)容器進(jìn)行健康狀態(tài)檢測(cè)。

Syntax:
	HEALTHCHECK [OPTIONS] CMD command

OPTIONS:
	--interval:多長(zhǎng)時(shí)間檢測(cè)一次,默認(rèn)30s
	--timeout:超時(shí)時(shí)長(zhǎng),默認(rèn)30s
	--start-period:容器啟動(dòng)后多久開始檢測(cè),默認(rèn)30s
	--retries:重試次數(shù):默認(rèn)3次

響應(yīng)碼:
	0:success
	1:unhealthy
	2:reserved
	
eg:
	HEALTHECK --interval=5m --timeout=30s CMD curl -f http://localhost/ || exit 1	

16.SHELL: 在使用 RUN、CMD 等命令時(shí),有些格式在運(yùn)行命令前會(huì)先啟動(dòng)一個(gè)sh進(jìn)程,默認(rèn)使用的是 /bin/sh,但在有些時(shí)候我們需要改變默認(rèn)的 SHELL。

Syntax:
	SHELL ["executable","parameters"]

17.STOPSIGAL: 默認(rèn)的 stop-signal 是 SIGTERM,在 docker stop 的時(shí)候會(huì)給容器內(nèi) PID 為1的進(jìn)程發(fā)送這個(gè) signal,通過(guò) --stop-signal 可以設(shè)置自己需要的 signal,主要的目的是為了讓容器內(nèi)的應(yīng)用程序在接收到 signal 之后可以先做一些事情,實(shí)現(xiàn)容器的平滑退出,如果不做任何處理,容器將在一段時(shí)間之后強(qiáng)制退出,會(huì)造成業(yè)務(wù)的強(qiáng)制中斷,這個(gè)時(shí)間默認(rèn)是10s。這個(gè)命令很少用到。

18.ONBUILD: 用于在 Dockerfile 中定義一個(gè)觸發(fā)器,Dockerfile 用于 build 映像文件,此映像文件亦可作為 base imag 被
另一個(gè) Dockerfile 用作 FROM 指令的參數(shù),并以之構(gòu)建新的映像文件,在后面的這個(gè) Dockerfile 中的 FROM 指令在 build 過(guò)程中被執(zhí)行時(shí),將會(huì)“觸發(fā)”創(chuàng)建其 base image 的 Dockerfile 文件中的 ONBUILD 指令定義的觸發(fā)器。簡(jiǎn)單來(lái)說(shuō),就是別人基于你的鏡像重新制作鏡像時(shí)才會(huì)觸發(fā)此命令。

Syntax:
	ONBUILD <INSTRUCTION>
注:
	1.盡管任何指令都可注冊(cè)成為觸發(fā)器指令,但ONBUILD不能自我嵌套,且不會(huì)觸發(fā)FROM和MAINTAINER指令
	2.使用包含ONBUILD指令的Dockerfile構(gòu)建的鏡像應(yīng)該使用特殊的標(biāo)簽,例如ruby:2.0-onbuild
	3.在ONBUILD指令中使用ADD或COPY指令應(yīng)該格外小心,因?yàn)樾聵?gòu)建過(guò)程的上下文在缺少指定的源文件時(shí)會(huì)失敗

2.2 簡(jiǎn)單示例

容器運(yùn)行nginx:

~]# mkdir myng
~]# cd myng
~]# cat Dockerfile
	#Dockerfile for my nginx
	
	FROM nginx:1.14-alpine
	
	LABEL maintainer="chuan <chuan@test.com>"
	
	ENV DOC_ROOT="/data/web/html/"
	
	#ARG參數(shù)不會(huì)寫到容器的環(huán)境變量中,所以在此環(huán)境下,PORT不會(huì)傳遞給配置中的變量,此處應(yīng)使用ENV
	#ARG PORT=80
	ENV PORT=80
	
	COPY entrypoint.sh /bin/
	ADD index.html $DOC_ROOT
	
	EXPOSE ${PORT}/tcp
	
	ENTRYPOINT ["/bin/entrypoint.sh"]
	CMD ["/usr/sbin/nginx","-g","daemon off;"]
	
	HEALTHCHECK --interval=10s --start-period=10s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/index.html

~]# cat index.html
	<h1>hello world</h1>

~]# cat entrypoint.sh 			#exec命令表示用將要執(zhí)行的進(jìn)程代替當(dāng)前進(jìn)程,否則此程序?qū)⒆鳛閟h的子進(jìn)程運(yùn)行
	#!/bin/sh
	#
	cat > /etc/nginx/conf.d/www.conf << EOF
	server {
	        server_name $HOSTNAME;
	        listen ${IP:-0.0.0.0}:${PORT:-8080};
	        root ${DOC_ROOT:-/usr/share/nginx/html};
	}
	EOF
	exec "$@"

~]# chmod a+x entrypoint.sh
~]# docker image build . -t 	test/myweb:v0.1		#PATH 要為Dockerfile文件的父目錄

容器運(yùn)行httpd:

~]# mkdir ap
~]# cd ap
~]# cat Dockerfile 
	#Dockerfile for my httpd
	
	FROM centos:7
	
	LABEL maintainer="chuan <chuan@test.com>"
	
	ENV doc_root=/var/www/html \
        listen_port=80 \
	    server_name=localhost
	
	RUN yum makecache && \
	    yum install -y httpd php php-mysql && \
	    yum clean all 
	
	ADD phpinfo.php ${doc_root}
	ADD entrypoint.sh /bin/
	
	EXPOSE 80/tcp
	
	VOLUME ${doc_root}
	
	CMD ["/usr/sbin/httpd","-DFOREGROUND"]
	ENTRYPOINT ["/bin/entrypoint.sh"]

]# cat phpinfo.php 
	<?php
	        phpinfo();
	?>

~]# cat entrypoint.sh
	#!/bin/bash
	
	LISTEN_PORT=${listen_port:-80}
	SERVER_NAME=${server_name:-localhost}
	DOC_ROOT=${doc_root:-/var/www/html}
	
	cat > /etc/httpd/conf.d/myweb.conf <<EOF
	Listen $LISTEN_PORT
	<VirtualHost *:$LISTEN_PORT>
	        ServerName "$SERVER_NAME"
	        DocumentRoot "$DOC_ROOT"
	        <Directory "$DOC_ROOT">
	                Options none
	                AllowOverride none
	                Require all granted
	        </Directory>
	</VirtualHost>
	EOF
	
	exec "$@"
	
~]# chmod a+x entrypoint.sh
~]# docker image build . -t 	test/myweb:v0.2

~]# docker container run --name myweb2 --rm -P test/myweb:v0.2	

到此這篇關(guān)于Docker中Dockerfile制作鏡像的方法步驟的文章就介紹到這了,更多相關(guān)Dockerfile制作鏡像內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Docker?安裝啟動(dòng)Jenkins的方法(docker-compose)

    Docker?安裝啟動(dòng)Jenkins的方法(docker-compose)

    這篇文章主要介紹了Docker?安裝啟動(dòng)?Jenkins(docker-compose)的方法,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-09-09
  • 從源碼構(gòu)建docker-ce的過(guò)程分析

    從源碼構(gòu)建docker-ce的過(guò)程分析

    這篇文章主要介紹了從源碼構(gòu)建docker-ce的過(guò)程,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-12-12
  • 聊聊docker?單機(jī)部署redis集群的問(wèn)題

    聊聊docker?單機(jī)部署redis集群的問(wèn)題

    這篇文章主要介紹了docker?單機(jī)部署redis集群,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-03-03
  • Docker安裝配置ES(elasticsearch)步驟詳解

    Docker安裝配置ES(elasticsearch)步驟詳解

    這篇文章主要給大家介紹了關(guān)于Docker安裝配置ES(elasticsearch)的相關(guān)資料,本文主要介紹了如何在指定目錄下安裝ES和Kibana,以及如何用IK分詞器進(jìn)行分詞,需要的朋友可以參考下
    2024-10-10
  • docker 復(fù)制容器的實(shí)現(xiàn)步驟

    docker 復(fù)制容器的實(shí)現(xiàn)步驟

    本文主要介紹了docker 復(fù)制容器的實(shí)現(xiàn)步驟,主要介紹了三種方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-10-10
  • Docker 容器之間的互相通信實(shí)現(xiàn)示例

    Docker 容器之間的互相通信實(shí)現(xiàn)示例

    本文主要介紹了Docker 容器之間的互相通信實(shí)現(xiàn)示例,通過(guò)創(chuàng)建自定義網(wǎng)絡(luò),你可以輕松地在 Docker 容器之間建立通信,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-01-01
  • Docker自定義JDK鏡像并拉取至阿里云鏡像倉(cāng)庫(kù)超詳細(xì)攻略

    Docker自定義JDK鏡像并拉取至阿里云鏡像倉(cāng)庫(kù)超詳細(xì)攻略

    Docker倉(cāng)庫(kù)是集中存放鏡像的地方,分為公共倉(cāng)庫(kù)和私有倉(cāng)庫(kù),這篇文章主要給大家介紹了關(guān)于Docker自定義JDK鏡像并拉取至阿里云鏡像倉(cāng)庫(kù)的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2024-08-08
  • Docker容器網(wǎng)絡(luò)互聯(lián)的項(xiàng)目實(shí)踐

    Docker容器網(wǎng)絡(luò)互聯(lián)的項(xiàng)目實(shí)踐

    docker中的容器都是連接到一個(gè)虛擬的網(wǎng)橋上的,這為獨(dú)立的容器提供了互聯(lián)的可能,本文主要介紹了Docker容器網(wǎng)絡(luò)互聯(lián)的項(xiàng)目實(shí)踐,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Docker 入門快速上手指南

    Docker 入門快速上手指南

    本篇文章主要介紹了詳解Docker 快速上手指南,記錄 Docker 中的常用操作、指令,使得大家能夠快速地使用 Docker。
    2017-03-03
  • docker可視化管理工具portainer忘記密碼重置教程的實(shí)現(xiàn)

    docker可視化管理工具portainer忘記密碼重置教程的實(shí)現(xiàn)

    本文主要介紹了docker可視化管理工具portainer忘記密碼重置教程的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08

最新評(píng)論