溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Docker基礎(chǔ)(4)——Dockerfile書(shū)寫(xiě)

發(fā)布時(shí)間:2020-07-22 05:14:06 來(lái)源:網(wǎng)絡(luò) 閱讀:813 作者:劉景宇 欄目:云計(jì)算

Docker中制作鏡像一共有兩個(gè)方法:

1.     基于容器制作鏡像:

docker commit …

2.     基于Dockerfile制作鏡像;

docker build …

 

Dockerfile的制作步驟:

       1.創(chuàng)建一個(gè)目錄;

       2.在目錄中創(chuàng)建一個(gè)首字母大寫(xiě)的文件,供docker build識(shí)別;

       3.因?yàn)镈ockerfile的執(zhí)行環(huán)境在創(chuàng)建的目錄中,所以可以創(chuàng)建相對(duì)應(yīng)的文件,供dockerfile使用;

       ex:

[root@master ~]# ls docimage
Dockerfile  index.html       
[root@master ~]# cat docimage/Dockerfile
FROM busybox:latest
 
LABEL maintainer="hevttc<ljy@163.com>"
 
ENV DOC_ROOT="/tmp/" \
              VOLUME_ROOT="/data/mydata" \
              ARGU="/usr/sbin/"
 
COPY index.html /tmp/
 
VOLUME ${VOLUME_ROOT}
 
RUN ifconfig -a && \
              cat ${DOC_ROOT}index.html

 

 

 

Dockerfile書(shū)寫(xiě)格式

Dockerfile Format

“#”開(kāi)頭的行是注釋行(可以多行,任意位置);

INSTRUCTION arguments

指令和對(duì)應(yīng)的參數(shù),建議指令大寫(xiě),參數(shù)小寫(xiě),默認(rèn)大小寫(xiě)均可;

能用一行指令完成,盡量不用多行指令;

第一行可執(zhí)行指令必須是FROM指令;

Docker是順序執(zhí)行Dockerfile中的內(nèi)容,注意書(shū)寫(xiě)順序;

 

Dockerfile中幾個(gè)重要的指令:

1.FROM (指定基準(zhǔn)鏡像)

FROM <repository>|:<tag> 或

FROM <repository>@<digest>

<repository>:指定作為base image的名稱(chēng);

<tag>:base image的標(biāo)簽,為可選項(xiàng),省略時(shí)默認(rèn)為latest;

 

2.LABEL(寫(xiě)入當(dāng)前Dockerfile的制作者信息);

LABEL <key>=<value> <key>=<value> <key>=<value> …

 

3.COPY(將宿主機(jī)的文件拷貝至鏡像中);

COPY <src> … <dest> 或COPY ["<src>",... "<dest>" ]

<src>:要復(fù)制的源文件或目錄,支持使用通配符;

<dest>:目標(biāo)路徑,即正在創(chuàng)建的image的文件系統(tǒng)路徑;建議為<dest>使用絕對(duì)路徑,否則,COPY指定則以WORKDIR為其起始路徑;

注意:在路徑中有空白字符時(shí),通常使用第二種格式;

 

4.ADD(類(lèi)似于COPY指令,支持TAR文件和URL路徑);

ADD <src> … <dest> 或ADD ["<src>",... "<dest>" ]

 

注意:

如果<src>為URL且<dest>不以"/"結(jié)尾,則<src>指定的文件將被下載并直接被創(chuàng)建為<dest>;如果<dest>以"/"結(jié)尾,則文件名URL指定的文件將被下載并保存為<dest>/<filename>;

如果<src>是一個(gè)本地系統(tǒng)上的壓縮格式的tar文件,它將被展開(kāi)為一個(gè)目錄,其行為類(lèi)似于"tar -x"命令;然而,通過(guò)URL獲取到的tar文件將不會(huì)被自動(dòng)展開(kāi);

如果<src>有多個(gè),或其間接或直接使用了通配符,則<dest>必須是一個(gè)以"/"結(jié)尾的目錄路徑;如果<dest>不以"/"結(jié)尾,則其被視作一個(gè)普通文件,<src>的內(nèi)容將被直接寫(xiě)入到<dest>;

 

5.WORKDIR(用于為Dockerfile中所有的RUN, CMD, ENTRYPOINT, COPY和ADD指定設(shè)定工作目錄;);

WORKDIR <dirpath>

在Dockerfile文件中,WORKDIR指令可出現(xiàn)多次,其路徑也可以為相對(duì)路徑,不過(guò),其是相對(duì)此前一個(gè)WORKDIR指令指定的路徑;

另外,WORKDIR也可以調(diào)用有ENV指定定義的變量;

 

6.VOLUME(用于在image中創(chuàng)建一個(gè)掛載點(diǎn)目錄,可以用于在Docker Host上掛載卷);

VOLUME <mountpoint> 或 VOLUME ["mountpoint"]

       個(gè)人并不建議使用:這是Docker daemon創(chuàng)建托管卷,并不是綁定掛載;

 

7.EXPOSE(為容器打開(kāi)要監(jiān)聽(tīng)的端口,實(shí)現(xiàn)與外部的通信);

       EXPOSE <port>[/<protocol>] <port>[/<protocol>] <port>[/<protocol>] …

              <protocol>用于指定傳輸層協(xié)議,可為T(mén)CP或UDP二者之一,默認(rèn)為T(mén)CP;

 

8.ENV(為鏡像定義環(huán)境變量,可以被其他指令調(diào)用,build_time和run_time都可被使用);

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

       調(diào)用格式:

       $variable_name或${variable_name}

 

9.ARG (在創(chuàng)建鏡像是build_time使用的變量,一般用ARG寫(xiě)版本號(hào)和作者);

ARG <name>[=<default value>]

 

10.RUN(用于指定Docker build過(guò)程中運(yùn)行的程序);

RUN <command> 或

RUN ["<excutable>","<param1>","<param2>",...](json數(shù)組)

 

11.CMD(類(lèi)似于RUN命令,在run_time執(zhí)行);

CMD <command> 或

CMD ["<excutable>","<param1>","<param2>",...] 或

CMD ["<param1>","<param2>",...] (為ENTRYPOINT指令提供默認(rèn)參數(shù))

 

12.ENTRYPOINT(類(lèi)似于CMD指令)

ENTRYPOINT <command>

ENTRYPOINT ["<excutable>","<param1>","<param2>",...]

 

[root@master ~]# cat docimage1/entrypoint.sh
#!/bin/sh
 
exec $@
[root@master ~]# cat docimage1/Dockerfile
FROM nginx:1.14-alpine
 
COPY entrypoint.sh /bin/
 
CMD ["/usr/local/nginx","-g","daemon off;"]
 
ENTRYPOINT ["/bin/entrypoint.sh"]
[root@master ~]# ll docimage1/
總用量 8
-rw-r--r-- 1 root root 129 11月  1 20:42 Dockerfile
-rwxr-xr-x 1 root root  19 11月  1 20:16 entrypoint.sh

 

命令執(zhí)行圖

Docker基礎(chǔ)(4)——Dockerfile書(shū)寫(xiě)

創(chuàng)建一個(gè)Dockerfile;

[root@www ~]# mkdir docimage
[root@www ~]# vim docimage/Dockerfile
[root@www ~]#
[root@www ~]# vim docimage/test.txt
[root@www ~]# cat docimage/Dockerfile
FROM nginx:1.14-alpine
 
LABEL maintainer="liujingyu<ljy_153@163.com>"
 
ENV DOC_ROOT="/tmp" \
              VOLUME_ROOT=/data/mydata
 
COPY test.txt ${DOC_ROOT}
 
VOLUME ${VOLUME_ROOT}
 
RUN echo 123 > ${DOC_ROOT}/test.txt
 
CMD cat ${DOC_ROOT}/test.txt
[root@www ~]#
[root@www ~]# cat docimage/test.txt
THIS is Docker TEST;


用Dockerfile創(chuàng)建鏡像:

[root@www ~]# docker build docimage/ -t ljymyy/nginx:v0.2
Sending build context to Docker daemon  3.072kB
Step 1/7 : FROM nginx:1.14-alpine
 ---> 77bae8d00654
Step 2/7 : LABEL maintainer="liujingyu<ljy_153@163.com>"
 ---> Using cache
 ---> a012ac4c6f51
Step 3/7 : ENV DOC_ROOT="/tmp"         VOLUME_ROOT=/data/mydata
 ---> Using cache
 ---> ee6ed363bfde
Step 4/7 : COPY test.txt ${DOC_ROOT}
 ---> Using cache
 ---> a416671fde2a
Step 5/7 : VOLUME ${VOLUME_ROOT}
 ---> Using cache
 ---> 84bf38b22301
Step 6/7 : RUN echo 123 > ${DOC_ROOT}/test.txt
 ---> Using cache
 ---> 756cd9857096
Step 7/7 : CMD cat ${DOC_ROOT}/test.txt
 ---> Running in a2f99fcc5fba
Removing intermediate container a2f99fcc5fba
 ---> dac468a636e0
Successfully built dac468a636e0
Successfully tagged ljymyy/nginx:v0.2
[root@www ~]# docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ljymyy/nginx        v0.2                dac468a636e0        2 minutes ago       17.7MB

運(yùn)行此鏡像:

[root@www ~]# docker container  run --rm  --name ngx1 ljymyy/nginx:v0.2
123



向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI